【发布时间】: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});
...原始应用程序加载并运行良好,除了序列化部分:
如果 MyApp.XMLSerializers.dll 存在于 MyOtherManagedApp 的工作目录中,我会收到一条错误消息,指出找不到 MyApp.exe 程序集(该错误是由自动生成的 MyApp.XMLSerializers.dll 引发的原因,尽管不仅 MyApp 程序集已加载而且实际上正在执行,但无法找到它)。
如果工作目录中不存在 MyApp.XMLSerializers.dll,则不会发生错误,但现在会在运行时生成序列化程序集,这会对性能造成很大影响。
那么,我的问题是为什么它不能正常工作?即,为什么 MyApp.XMLSerializers.dll 在 MyApp.exe 自行运行时启动序列化可以完美运行;而如果它是通过来自不同程序集的 Assembly.Load 和 InvokeMember 启动的,MyApp.XMLSerializers.dll 会抱怨它找不到完全相同的已动态加载并正在运行的 MyApp 程序集?
【问题讨论】:
-
我怀疑这可能与可以加载程序集的 3 个上下文有关。我的怀疑是,如果程序集是从字节数组加载的,正如文档所说,它将被加载到与主应用程序不同的上下文中,因此它可能无法正确检测到序列化程序程序集?
-
对我来说听起来像是一个循环依赖。它可能正在尝试加载旧版本的 .exe 并失败。您可以通过 fuslogvw.exe 看到它,在 .exe 中找到您序列化程序集所需的类型可能会更困难一些。构建 + 清理并仅构建您的程序集。
标签: .net xml serialization assemblies