【问题标题】:XMLSerializers Dll Loading Fails with Assembly.Load(byte[] asm)XMLSerializers Dll 加载失败,Assembly.Load(byte[] asm)
【发布时间】:2012-03-19 20:48:13
【问题描述】:

关于 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.XMLSerializers.dll 在 MyApp.exe 自行运行时启动序列化可以完美运行;而如果它是通过来自不同程序集的 Assembly.Load 和 InvokeMember 启动的,MyApp.XMLSerializers.dll 会抱怨它找不到完全相同的已动态加载并正在运行的 MyApp 程序集?

【问题讨论】:

  • 我怀疑这可能与可以加载程序集的 3 个上下文有关。我的怀疑是,如果程序集是从字节数组加载的,正如文档所说,它将被加载到与主应用程序不同的上下文中,因此它可能无法正确检测到序列化程序程序集?
  • 对我来说听起来像是一个循环依赖。它可能正在尝试加载旧版本的 .exe 并失败。您可以通过 fuslogvw.exe 看到它,在 .exe 中找到您序列化程序集所需的类型可能会更困难一些。构建 + 清理并仅构建您的程序集。

标签: .net xml serialization assemblies


【解决方案1】:

我找到了解决这个特定问题的方法。解决方案是在 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(它不会作为文件出现在任何地方)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2012-12-21
    • 2012-12-29
    • 2020-09-01
    • 2019-07-10
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多