使用Assembly.Load(byte [] asm)XMLSerializers DLL加载失败

时间:2012-03-19 20:48:13

标签: .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,则不会发生错误,但现在正在运行时生成序列化程序集,从而导致性能大幅下降。

  3. 所以,我的问题是为什么它不能正常工作?也就是说,如果MyApp.exe在它自己运行时启动了序列化,那么MyApp.XMLSerializers.dll可以正常工作的原因;如果它是通过另一个程序集中的Assembly.Load和InvokeMember启动的,那么MyApp.XMLSerializers.dll会抱怨它找不到已经动态加载并正在运行的同一个MyApp程序集?

1 个答案:

答案 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(它不作为文件出现在任何地方)。