如何将非托管dll嵌入控制台应用程序

本文关键字:控制台 应用程序 dll | 更新日期: 2023-09-27 18:24:13

大家好,我读了很多关于这个问题的文章,但我尝试过的都不起作用。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using xNet.Net;
using xNet.Collections;
namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("user32.dll")]
        internal static extern bool OpenClipboard(IntPtr hWndNewOwner);
        [DllImport("user32.dll")]
        internal static extern bool CloseClipboard();
        [DllImport("user32.dll")]
        internal static extern bool SetClipboardData(uint uFormat, IntPtr data);

        [STAThread]
        static void Main(string[] args)
        {
            go();
        }
        public static void go()
        {
            CookieDictionary cookies = new CookieDictionary();
            Console.WriteLine(@"[~] Trying to upload text to http://pastebin.ru/");
            try
            {
                using (var request = new HttpRequest())
                {
                    request.UserAgent = HttpHelper.ChromeUserAgent();
                    request.EnableEncodingContent = true;
                    request.Cookies = cookies;
                    request.AllowAutoRedirect = false;
                    var postData = new RequestParams();
                    postData["parent_pid"] = "";
                    postData["std-x"] = "1440";
                    postData["std-y"] = "900";
                    postData["poster"] = "";
                    postData["code_name"] = "";
                    postData["code"] = @"text";
                    postData["mode"] = "178";
                    postData["private"] = "1";
                    postData["expired"] = "1";
                    postData["paste"] = "Отправить";
                    var response = request.Post("http://pastebin.ru/", postData);
                    var url = response.Location;
                    if (string.IsNullOrEmpty(url))
                    {
                        Console.WriteLine(@"[!] Failed to upload text to http://pastebin.ru/'r'n");
                        Console.ReadKey();
                    }
                    else
                    {
                        url = @"http://pastebin.ru" + url;
                        Console.WriteLine(@"[+] Successfully uploaded to " + url);
                        OpenClipboard(IntPtr.Zero);
                        var ptr = Marshal.StringToHGlobalUni(url);
                        SetClipboardData(13, ptr);
                        CloseClipboard();
                        Marshal.FreeHGlobal(ptr);
                    }
                }
            }
            catch (NetException ex)
            {
                Console.WriteLine("Net error: " + ex.Message.ToString());
            }
        }
    }
}

我试图添加对dll的引用,将其添加到项目中,将"生成操作"更改为嵌入资源,但什么都不起作用。有什么帮助吗?

如何将非托管dll嵌入控制台应用程序

让我们调用项目的程序集MyAssembly

在Visual Studio中的项目根目录下创建一个新文件夹。让我们称之为MyDlls

将要包含的程序集放在此文件夹中,并将其生成操作设置为嵌入资源

然后,在代码中添加以下元素:

class Program
{
    // ... Your code
    [STAThread]
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolve;  // Called when the assembly hasn't been successfully resolved
        // ... Your code
    }
    private Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        string assemblyName = args.Name.Split(',')[0];  // Gets the assembly name to resolve.
        using (Stream stream = assembly.GetManifestResourceStream("MyAssembly.MyDlls." + assemblyName + ".dll"))  // Gets the assembly in the embedded resources
        {
            if (stream == null)
                return null;
            byte[] rawAssembly = new byte[stream.Length];
            stream.Read(rawAssembly, 0, (int)stream.Length); 
            return Assembly.Load(rawAssembly);
        }
    }
}