C# 混合装配赢得';t从ILED结果加载

C# 混合装配赢得';t从ILED结果加载,c#,ilmerge,C#,Ilmerge,我有一个参考的简单程序。它包含3个DLL: AlphaFS.dll(IL) AlphaVSS.Common.dll(IL) AlphaVSS.x64.dll(混合) 现在我想将我的main.exe与AlphaFS.dll和AlphaVSS.Common.dll合并,只在磁盘上保留AlphaVSS.x64.dll 因此,我添加了一个AssemblyResolve事件以从system32加载AlphaVSS.x64.dll: AppDomain.CurrentDomain.AssemblyRes

我有一个参考的简单程序。它包含3个DLL:

  • AlphaFS.dll(IL)
  • AlphaVSS.Common.dll(IL)
  • AlphaVSS.x64.dll(混合)
现在我想将我的
main.exe
AlphaFS.dll
AlphaVSS.Common.dll
合并,只在磁盘上保留
AlphaVSS.x64.dll

因此,我添加了一个AssemblyResolve事件以从system32加载AlphaVSS.x64.dll:

AppDomain.CurrentDomain.AssemblyResolve += (sender, args2) =>
{
   Console.WriteLine("Loading " + args2.Name);

   string name = args2.Name.Split(',')[0];
   string path = "c:\\windows\\system32\\" + name + ".dll";

   if (args2.Name.StartsWith("AlphaVSS"))
   {
       if (File.Exists(path))
       {
           return Assembly.LoadFrom(path);
       }
   }

   return null;
};
我成功地合并了其余部分:

%ILMerge% /v4 /ndebug /out:"$(TargetDir)all-in-one.exe" "$(TargetDir)$(TargetFileName)" "$(TargetDir)AlphaVSS.Common.dll" "$(TargetDir)AlphaFS.dll"
然后我只将
all-in-one.exe和AlphaVSS.x64.dll
复制到另一台计算机上,并启动了all-in-one.exe。要加载的第一个DLL是AlphaVSS.x64.DLL,它已加载。然后它尝试加载
AlphaVSS.Common.dll
,但找不到它

从ILSpy中,
AlphaVSS.Common.dll
已合并到
all-in-one.exe中并加载。但是混合程序集
AlphaVSS.x64.dll
仍在引用
AlphaVSS.Common.dll
,因此它尝试再次加载它


有人知道如何解决这个问题吗?

根据您在评论中的回答,当您从驱动器加载
AlphaVSS.x64.dll
时,它会尝试加载
AlphaVSS.Common.dll
(因为它引用了它)

但您已经用自定义解析器捕获了它。由于
AlphaVSS.Common.dll
包含
AlphaVSS
,如果(args2.Name.StartsWith(“AlphaVSS”)
并且您的解析器将尝试从驱动器加载
AlphaVSS.Common.dll
,则此条件将为真

您需要做的是修改解析器,使其仅从驱动器加载
AlphaVSS.x64.dll
,并从当前程序集的内容加载
AlphaVSS.Common.dll

如果是
AlphaVSS.Common.dll
请尝试执行以下操作:

Assembly Assembly=AppDomain.CurrentDomain.GetAssemblys()
.Where(a=>a.GetName().Name==“AlphaVSS.Common”)
.Single();

那么,在另一台计算机上,您有all-in-one.exe(内置AlphaVSS.Common.dll)和AlphaVSS.x64.dll?当AlphaVSS.x64.dll尝试加载AlphaVSS.Common.dll时,您的解析器是否会被执行?@МааСааааааааааа;是的,有一个控制台输出指示这一点。