C# 混合装配赢得';t从ILED结果加载
我有一个参考的简单程序。它包含3个DLL: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
- 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时,您的解析器是否会被执行?@МааСааааааааааа;是的,有一个控制台输出指示这一点。