关于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程序集?
答案 0 :(得分:3)
我找到了解决这个特定问题的方法。解决方案是为BOTH MyApp.XMLSerializers.dll和MyApp.exe(作为资源嵌入的那个)处理AppDomain.CurrentDomain.AssemblyResolve事件INSIDE MyApp.exe!
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(它不作为文件出现在任何地方)。