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

C#4.0将.dll程序集与.NET合并,c#,.net,dll,assemblies,merge,C#,.net,Dll,Assemblies,Merge,由于我想到了一个新的想法,即使用Jeffrey Richter写在上面的方法将.dll库合并到我的应用程序中,所以我决定让我的应用程序自生自灭。因此,我添加了我的.dll文件作为嵌入式资源,并将其添加为引用。然后在Program.cs中(我不知道他发布的代码应该放在哪里),我添加了以下内容: ... [STAThread] static void Main() { Application.EnableVisualStyles();

由于我想到了一个新的想法,即使用Jeffrey Richter写在上面的方法将.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改成别的吗?我(在正确的地方)加对了吗


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

使用调试器。在AssemblyResolve分配和lambda正文上设置断点。单步执行代码

是的,太晚了。移动作业。如果SingleInstanceController位于这样一个DLL中,那么Main()方法就永远不会启动。将该代码移动到一个单独的助手方法中,并为其指定[MethodImpl(MethodImplOptions.NoInLine)]属性


在单个文件中分发程序已经得到了很好的支持,它不需要任何代码,也不需要合并DLL。还负责桌面快捷方式、文件关联以及在旧计算机上安装.NET。在AppDomain尝试解析引用(即入口点和第一行中的引用)之前,它被称为setup.exe

钩住AssemblyResolve事件

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

您的问题与此问题非常相似:

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


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

只是好奇;为什么还要费心(有效地)静态链接一个DLL?因为我不想分发我的程序,用户会发现10-15个文件是无用的。为什么用户还要在程序文件中到处挖掘呢?只需将它们安装到一个子目录中,就可以完成了。我的意思是,“DLL”中的“DL”代表“动态链接”。是的,谢谢你完全忽略了我的问题。我问为什么我的代码不起作用,或者我做错了什么,而不是“我是否应该用我的应用程序分发.dll文件”。我有理由不将.EXE文件与一堆.dll文件一起分发。另外,setup.exe来自哪里?我的应用程序是一个相对较小且可移植的应用程序,我甚至不想使用它。我没有忽略你的问题,你忽略了答案。不要只读最后一段。在调试问题之前,您不会得到完美的答案。“在调试问题之前”是您不知道如何使用调试器的问题?当你单步执行该计划时发生了什么?我给出了答案,但在你尝试之前,你无法看到答案。“我尽量避免使用调试器”。我不敢相信我刚刚读到了……我不太清楚你的第一句话是什么意思,你能解释一下吗?(抱歉,我对C#有点陌生,没有太多经验)。移动AppDomain.CurrentDomain.AssemblyResolve+=。。。。到Main方法中的第一行。我得到以下错误:“无法加载文件或程序集”文件,版本=2.3.4025.2210,区域性=中性,PublicKeyToken=null”或其依赖项之一。执行此操作时,指针无效(HRESULT中的异常:0x80004003(E_指针)),并重命名我的资源名。替换字符串resourceName=“AssemblyLoadingAndReflection.”+新的AssemblyName(argsx.Name).Name+“.dll”;字符串resourceName=String.Format(“MyApp.{0}”,args.Name”);即使我添加了字符串resourceName=String.Format(“MyApp.{0},args.Name)+.dll,错误仍然存在"; 也这肯定表明它找不到组件,但我想不出它会这样做的任何原因。我添加了对该文件的引用,还嵌入了它,并按照您所说的将代码移到了第一行。