[c#]如何将非托管的 dll 嵌入到控制台应用程序

标签: dll C#
发布时间: 2013/12/8 16:18: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 的引用,将其添加到项目,更改生成操作为嵌入的资源,但什么都没有用。任何帮助吗?

解决方法 1:

让我们调用项目的程序集 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);
        }
    }
}
赞助商