.net - XMLSerializers Dll 加载失败,出现 Assembly.Load(byte[] asm)

标签 .net xml serialization assemblies

我在 xml 序列化方面遇到了奇怪的情况...

如果我使用正确生成的 MyApp.XMLSerializers.dll 运行 MyApp.exe(.NET 2.0 WinForms 应用程序),一切都会很好,并且序列化速度很快(运行时不会生成序列化程序集,因为找到了序列化程序 dll 并且正在运行) .

现在,如果我将 MyApp.exe 作为资源嵌入到 MyOtherManagedApp.exe(也是 .net 2.0)中,并从内部执行原始应用程序,如下所示...

pasm = System.Reflection.Assembly.Load(MyOtherManagedApp.Properties.Resources.MyAppExeBinary);
Type type = pasm.GetType("MyApp.MyModule");
type.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic,  null, null, new object[] {args});

...原始应用程序加载并运行得很好,除了序列化部分:

  1. 如果 MyApp.XMLSerializers.dll 存在于 MyOtherManagedApp 的工作目录中,我会收到一条错误,指出找不到 MyApp.exe 程序集(该错误是由自动生成的 MyApp.XMLSerializers.dll 引发的,这对于一些奇怪的情况)原因,尽管 MyApp 程序集不仅已加载而且实际上正在执行,但未能找到它)。

  2. 如果工作目录中不存在 MyApp.XMLSerializers.dll,则不会发生错误,但现在在运行时生成序列化程序集,这会导致性能大幅下降。

所以,我的问题是为什么它不能正常工作?也就是说,如果 MyApp.exe 在其自身运行时启动序列化,为什么 MyApp.XMLSerializers.dll 可以完美地工作;而如果它是通过 Assembly.Load 和 InvokeMember 从不同的程序集启动的,MyApp.XMLSerializers.dll 会提示它找不到已动态加载且正在运行的完全相同的 MyApp 程序集?

最佳答案

我找到了这个特定问题的解决方案。解决方案是在 MyApp.exe 内部处理 MyApp.XMLSerializers.dll 和 MyApp.exe(作为资源嵌入的那个)的 AppDomain.CurrentDomain.AssemblyResolve 事件!

If e.Name.StartsWith(XMLSerializersAssemblyName) Then 'MyApp.XMLSerializers.dll lookup
   Return Assembly.LoadFile(MyOtherManagedApp_EXEFolder + "\" + XMLSerializersAssemblyName + ".dll")
ElseIf e.Name = Assembly.GetExecutingAssembly.FullName Then 'MyApp.exe lookup
   Return Assembly.GetExecutingAssembly
End If

这样,MyApp.XMLSerializers.dll 就可以找到并正确加载,更重要的是,MyApp.XMLSerializers.dll 可以找到嵌入的 MyApp.exe(它不作为文件存在于任何地方)。

关于.net - XMLSerializers Dll 加载失败,出现 Assembly.Load(byte[] asm),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777702/

相关文章:

具有 Entity Framework 的 SQL Server xml 列 - 如何保留无关紧要的空格

java - 在 Java 中存储数据的最佳方式(如 pickle)

c# - 如何使用 myString.PadLeft?

c# - 不使用 JavaScript 验证 ASP.NET GridView 中的条目

java - JAXB - 如果类是同一类的字段,我们是否应该使用 @XmlSeeAlso 绑定(bind)类

PHP:调用未定义函数:simplexml_load_string()

c# - 使用 C# 的 odp.net 批量复制

c# - 从应用程序资源加载 .NET 程序集并从内存中运行它,但不终止主/主机应用程序

serialization - 使用#[serde(untagged)] 和#[serde(with)] 的组合反序列化枚举

.net - xml 字符串的通用反序列化