gpt4 book ai didi

c# - 如何为 DLL 而不是 EXE 选择 sgen 生成的 XmlSerializer DLL?

转载 作者:行者123 更新时间:2023-11-30 16:42:45 26 4
gpt4 key购买 nike

我有一个名为 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,有一个扩展只是程序文件中那些主要组件的加载器。该扩展使用 LoadFrom 加载这些主要组件,其中之一是 EntrianSourceSearch_14.dll

最佳答案

如果您已经构建并部署了一个已签名的序列化程序集,您可以在加载和缓存序列化程序时添加一个 CurrentlDomain.AssemblyResolve 处理程序,例如:

    private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
var codeBase = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath;
var serializerPath = Path.Combine(Path.GetDirectoryName(codeBase), new AssemblyName(args.Name).Name + ".dll");
if (File.Exists(serializerPath))
return Assembly.LoadFrom(serializerPath);
else
return null;
}

但是,我找不到在单个程序集 VS 扩展中包含序列化程序集部署的简单方法。

我确实找到了一种可能更可取的替代方法。它避免了直接调用Assembly.LoadFrom以及上面代码中的一些假设:

  • 将使用 Xml 序列化的代码移到单独的程序集中
  • 对于这个程序集:
  • 从扩展包中添加对上述程序集的项目引用
  • 添加对扩展包中构建的序列化程序集的Browse.. 引用

关于c# - 如何为 DLL 而不是 EXE 选择 sgen 生成的 XmlSerializer DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46121670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com