C# 4.0 将 .dll 程序集与 .NET 合并

标签 c# .net dll assemblies merge

我决定离开我的 other question死,因为我想到了一个新想法,使用 Jeffrey Richter 的方法写在 this page 上将 .dll 库合并到我的应用程序中。所以我将我的 .dll 文件添加为嵌入式资源,并将其添加为引用。然后在 Program.cs 中(我不知道他发布的代码应该去哪里),我添加了这个:

    ...
    [STAThread]
    static void Main()
    {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            string[] args = Environment.GetCommandLineArgs();
            if (args.Length > 1)
                _in = args[1];
            SingleInstanceController controller = new SingleInstanceController();
            controller.Run(args);

            AppDomain.CurrentDomain.AssemblyResolve += (sender, argsx) =>
{
String resourceName = "AssemblyLoadingAndReflection." +
   new AssemblyName(argsx.Name).Name + ".dll";
using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
    Byte[] assemblyData = new Byte[stream.Length];
    stream.Read(assemblyData, 0, assemblyData.Length);
    return Assembly.Load(assemblyData);
    }
}
        ;

我应该将 resourceName 更改为其他名称吗?我是否正确添加了它(在正确的位置)?

现在的问题是,它仍然无法找到并加载程序集,我不确定我做错了什么。任何帮助将不胜感激。

最佳答案

您的问题与此非常相似:C#: How to embed DLL into resourcefile (no dll copy in program directory)

基本上,您的 AppDomain.AssemblyResolve 事件处理程序没有被调用,因为 Main 编译失败。即使它确实编译了,附加事件处理程序也应该是您在 main 中做的第一件事。

我对上述问题的回答有一个有效的代码示例,并解释了为什么您的代码不起作用。

关于C# 4.0 将 .dll 程序集与 .NET 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4637962/

相关文章:

c# - DBMetal 为 sqlite_sequence 生成无效类

c# - 使用 MaxWorkingSet 限制进程内存

visual-studio-2008 - 在VS中,如何防止dll在引用时被复制

c++ - 在函数中将其用作缓冲区时获取 char* 中的垃圾数据

c# - 访问 TreeView 控件中的所有节点

c# - 针对 Azure/CDN 进行编程

c# - 通用方法和转换 : how to define that Type 1 is convertible to Type 2

c# - 如何使用 .NET 获取月份的最后一个星期五

.net - MVC 是 RESTful 设计的吗

c++ - 如何查看从 Matlab 中的 Mex 函数使用的 DLL 调用的 printf 的输出?