如何为DLL而不是EXE获取sgen生成的XmlSerializer DLL?

时间:2017-09-08 17:21:57

标签: c# .net dll xml-serialization xmlserializer

我有一个名为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

1 个答案:

答案 0 :(得分:2)

如果您已经构建并部署了签名的序列化程序集,则可以在加载和缓存序列化程序时添加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序列化的代码移动到单独的程序集
  • 对于这个程序集:
  • 从扩展程序包
  • 添加Project对上述程序集的引用
  • 从扩展程序包
  • 添加Browse..对构建的序列化程序集的引用