我在 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});
...原始应用程序加载并运行得很好,除了序列化部分:
如果 MyApp.XMLSerializers.dll 存在于 MyOtherManagedApp 的工作目录中,我会收到一条错误,指出找不到 MyApp.exe 程序集(该错误是由自动生成的 MyApp.XMLSerializers.dll 引发的,这对于一些奇怪的情况)原因,尽管 MyApp 程序集不仅已加载而且实际上正在执行,但未能找到它)。
如果工作目录中不存在 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/