我有一个名为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
。
答案 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
以及上面代码中的一些假设:
Build->Generate serialization assembly
选项Project
对上述程序集的引用
Browse..
对构建的序列化程序集的引用