如何解决混合装配不会从ILMerge-ed结果中加载
我有一个引用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();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。