Ошибка загрузки XMLSerializer с помощью Assembly.Load (byte [] asm) - PullRequest
3 голосов
/ 20 марта 2012

У меня странная ситуация с сериализацией XML ...

Если я запускаю MyApp.exe (приложение .NET 2.0 WinForms) с правильно сгенерированным MyApp.XMLSerializers.dll, то все в порядке, и сериализация происходит быстро (сборки во время выполнения не генерируются, поскольку 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, которая была динамически загружена и сейчас выполняется?

1 Ответ

3 голосов
/ 27 марта 2012

Я нашел решение для этой конкретной проблемы.Решение состоит в том, чтобы обработать событие AppDomain.CurrentDomain.AssemblyResolve для ОБА MyApp.XMLSerializers.dll И MyApp.exe (тот, который встроен в качестве ресурса) 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 (которого нет нигде в виде файла).

...