Предварително генериране на XmlSerializers с помощта на Sgen и ILMerge. Проблем с масивите

Използвам широко XmlSerializer и вместо да позволявам на .NET да генерира необходимите сборки за сериализиране по време на изпълнение, бих искал да генерирам тези сборки предварително и да ги свържа с моето приложение. Мога да използвам Sgen за генериране на тези сборки по време на изграждане. Освен това трябва да стартирам Sgen отделно за всеки тип масив, който ще сериализирам (използвайки sgen /t:Foo[]). И накрая, използвам ILMerge, за да обединя класовете за сериализация на типа масив в сборката Foo.XmlSerializers.dll. Проверих с ildasm, че Foo.XmlSErializers.dll всъщност съдържа всички обединени класове.

По време на изпълнение .NET успешно зарежда FooSerializer от Foo.XmlSerializers.dll без извикване на csc и генериране на временно събрание. Въпреки това .NET не успява да зареди ArrayOfFooSerializer от същата dll и всъщност извиква csc.

Как мога успешно да генерирам предварително типове сериализация за масиви?

Разгледайте следните 2 сборки и тяхното опростено съдържание:

Сглобяване: MyApp.exe

public class MyApp
{
    public static int Main(string[] args)
    {
        new XmlSerializer(typeof(Foo));
        new XmlSerializer(typeof(Foo[]));
    }
}

Сглобяване: Foo.dll

public class Foo
{

}

Допълнителна информация:

Следният app.config кара събития, свързани с XmlSerialization, да се добавят към регистъра на събитията

<configuration>
  <system.diagnostics> 
    <switches> 
      <add name="XmlSerialization.PregenEventLog" value="1" />
      <add name="XmlSerialization.Compilation" value="1" />
    </switches> 
  </system.diagnostics>
</configuration>

Не виждам събития за типа Foo. Виждам следното съобщение за Foo[]:

Предварително генерираният сериализатор „Foo.XmlSerializers“ е изтекъл. Трябва да генерирате повторно сериализатор за „Foo[]“.


person anthony    schedule 04.12.2009    source източник


Отговори (2)


Вашият проблем всъщност може да се дължи на факта, че сте стартирали ILMerge. Сглобката за сериализиране, която генерирате, проследява точната версия на сглобката, от която е генерирана, и ще каже, че е изтекла, ако има някаква разлика (дори и само в кода, а не в интерфейса). Както се оказва, ILMerge променя този ID на асемблирането, което може да е причината за това. Вижте тази публикация за повече информация относно проблема .

person Nick    schedule 04.03.2010

Можете да опитате да разгледате sgen от Mono, той позволява генериране на сериализиращо сглобяване за множество типове наведнъж.

person Juozas Kontvainis    schedule 23.07.2010