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

问题描述:

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

... 
    [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); 
    } 
} 
     ; 

我应该资源名称更改为别的东西吗?我是否正确添加了它(在正确的地方)?

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

+2

只是好奇;为什么甚至打扰(有效)静态链接一个DLL? – 2011-01-09 06:59:29

+3

因为我不想分发我的程序将用户发现的10-15个文件无用。 – Iceyoshi 2011-01-09 07:12:33

+2

为什么用户在程序文件中进行挖掘?只需将它们安装到一个子目录中并完成它。我的意思是,“DLL”中的“DL”代表你知道的“动态链接”。 – 2011-01-09 08:17:28

在AppDomain尝试解析引用(即入口点和第一行)之前挂钩到AssemblyResolve事件。

嵌入式资源名称以应用程序名称后跟资源名称开头。 例如:ConsoleApplication.Test.dll。

使用调试器。在AssemblyResolve赋值和lambda主体上设置断点。单步执行代码。

是的,这太晚了。移动作业。如果SingleInstanceController在这样的DLL中,那么Main()方法甚至不会启动。将该代码移入单独的帮助器方法并为其提供[MethodImpl(MethodImplOptions.Noinlining)]属性。

将程序分布在单个文件中已得到很好的支持,它不需要任何代码或合并DLL。还负责桌面快捷方式,文件关联以及在旧机器上安装.NET。它叫做setup.exe

+2

是的,谢谢你完全无视我的问题。我问为什么我的代码不工作,或者我做错了什么,而不是“我应该使用我的应用程序分发.dll文件”。我有我的理由不分发带有一堆.dll文件的.EXE文件。另外,setup.exe从哪里来?我的应用程序是一个相对较小且便携的应用程序,我甚至不想使用它。 – Iceyoshi 2011-01-09 07:11:24

你的问题非常类似这样的:C#: How to embed DLL into resourcefile (no dll copy in program directory)

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

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