微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

混合装配不会从ILMerge-ed结果中加载

如何解决混合装配不会从ILMerge-ed结果中加载

我有一个引用The open-source AlphaVSS library的简单程序。它包含3个dll:

  • AlphaFS.dll(IL)
  • AlphaVSS.Common.dll(IL)
  • AlphaVSS.x64.dll(混合)

现在,我想将main.exeAlphaFS.dllAlphaVSS.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 举报,一经查实,本站将立刻删除。