【发布时间】:2018-02-17 16:28:45
【问题描述】:
我有一个名为ess.exe 的可执行文件。我使用sgen.exe为其生成了一个XmlSerializer DLL,当我运行它时,它会获取生成的ess.XmlSerializers.dll,一切都很好。
我还有一个名为EntrianSourceSearch_14.dll 的DLL,它是使用Assembly.LoadFrom(DllPathname) 动态加载的。如果我为那个 DLL 生成一个 XmlSerializer DLL,它不会拾取生成的 DLL;相反,它会退回到 XML 序列化代码的运行时生成。
如何让我的 DLL 获取其相应生成的 XmlSerializer DLL?
编辑:我无法将 XmlSerializer DLL 放入可执行文件的目录中,因为我的 DLL 是 Visual Studio 扩展的一部分 - 可执行文件是 Visual Studio (devenv.exe),将我的产品片段复制到其目录中可能会被视为反社会。 :-)
编辑以添加更多上下文:这是一个 Visual Studio 插件和扩展。它适用于 2005 年至 2017 年的所有 Visual Studio 版本。大部分代码安装到 Program Files 中,而旧版本的 Visual Studio 只需从那里作为加载项加载它。对于不支持插件的较新版本的 Visual Studio,有一个扩展,它只是 Program Files 中这些主要组件的加载器。该扩展使用LoadFrom 加载这些主要组件,其中之一是EntrianSourceSearch_14.dll。
【问题讨论】:
-
您可以在this post 中看到加载程序集的代码的 sn-p。注意对 Assembly.Load() 的调用,它不会在 LoadFrom() 所做的同一目录中查找。您可以使用 Fuslogvw.exe 进行验证。考虑将 xmlserializers.dll 程序集移动到与 exe 相同的目录中。
-
@HansPassant:感谢您的解释以及程序集加载代码的链接。关于“将 xmlserializers.dll 程序集移动到与 exe 相同的目录”,DLL 是 Visual Studio 扩展的一部分,因此可执行文件是 Visual Studio (devenv.exe)。将我的产品部分复制到其目录中可能会被视为反社会!
-
诸如此类的重要细节属于问题,而不是评论。尽可能多地添加上下文信息。然后还有一些。
-
您是否尝试过挂钩
AppDomain.AssemblyResolve事件msdn.microsoft.com/en-us/library/… 看看是否可以在询问时传递信息? -
伙计们,请记住,OP 在记录问题方面做得很差。这是一个 VS 扩展,它不应该使用 LoadFrom,因为所有二进制文件都必须由扩展安装程序部署。但无论是插件还是 VSIX 扩展,使用的是什么 VS 版本,这是否只是为了调试代码而进行的 hack,都只是盲目猜测。
标签: c# .net dll xml-serialization xmlserializer