问题描述
我有一个引用The open-source AlphaVSS library的简单程序。它包含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 and 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
,因此此条件为if (args2.Name.StartsWith("AlphaVSS"))
,并且您的解析器将尝试从驱动器加载AlphaVSS.Common.dll
。
您需要做的就是修改解析器,使其仅从驱动器中加载AlphaVSS.x64.dll
,并从当前程序集的内容中加载AlphaVSS.Common.dll
。
对于AlphaVSS.Common.dll
,请尝试执行以下操作:
Assembly assembly = AppDomain.CurrentDomain.GetAssemblies()
.Where(a => a.GetName().Name == "AlphaVSS.Common")
.Single();