2010-08-17 3 views
0

xml-deserialization 및 동적으로로드 된 어셈블리에 문제가 있습니다. 내 어셈블리를 zip 파일에서 바이트 배열로 직접로드합니다. 그런 다음이 어셈블리를로드합니다. 어셈블리에는 XmlSerializer를 사용하여 deserialize해야하는 데이터 모델이 포함되어 있습니다. 문제는 XML을로드하려고 할 때 항상 TypeInitializationException이 발생한다는 것입니다. 내가 바이트 배열로 우편에서 DLL 파일에서 직접 내 DLL을로드하고, 그렇지 않은 경우동적으로로드 된 어셈블리로 XML 비 직렬화

System.InvalidOperationException: Fehler im XML-Dokument (62,13). ---> 
    System.TypeInitializationException: Der Typeninitialisierer für 
    "Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderOrder" hat eine 
    Ausnahme verursacht. ---> System.NullReferenceException: Der Objektverweis wurde 
    nicht auf eine Objektinstanz festgelegt. 
    bei Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderOrder..cctor() 

는, XML이 성공적으로 직렬화 수 :

예외는 (독일어) 다음과 같다 .

내가 인터넷에서 발견 한 문제는 자체 유형 목록 일 수 있지만 거기에서 발견 한 해결책은 내 문제를 해결하지 못했습니다.

편집 : 내가 바이트 배열을 통해 어셈블리를로드 할 경우 다른 웹 사이트에 기록 된대로 나는, 자신의 유형의 일반적인 목록을 사용할 수없는 것으로 나타났습니다

. 나는 왜이 솔루션으로 성공하지 못했지만, 두 번째 시도 후에도 성공할 수 없다고 말할 수 없었다. 나는 ArrayList로 해결 방법을 만들었지 만, 나는 이것을 매우 불만스럽게 느낀다. 일반 목록을 사용할 수있는 더 나은 솔루션이 있습니까? 아니면 더 나은 해결책이 없다면 XML을위한 더 나은 시리얼 라이저/디시리얼라이저가 있습니까?

+0

나는 다른 사람에게 물체를 연재하려 할 때, 나는 paramterless consultor가 없기 때문에 whinged했다. 반대 작업을 수행하면 문제가 발생할 수 있습니다. – brumScouse

답변

0

나는 직렬화하려고하는 유형이 포함 된 각 어셈블리에 대해 sgen을 사용하여 직렬화 어셈블리 (* .XmlSerializers.dll)를 작성하고이 작업을 수행 할 때마다 내 응용 프로그램에 포함시키기 위해 sgen을 사용하여이 문제를 해결했다. 그런 다음 런타임에 bin 경로에 있는지 확인하십시오. XmlSerialization은 * .XmlSerializers.dll을 검사하고 런타임에 해당 serialization 형식을 만드는 대신 이러한 serialization 형식을 사용합니다.

+0

문제는 bin 경로에 plugin specific-dll이 없어야한다는 것입니다. 제 의도는 모든 플러그인 관련 내용이 zip 파일에서 직접로드된다는 것입니다. – martin

+0

플러그인 dll에 대한 직렬화 어셈블리를 만들고 zip에서 플러그인 dll을로드하는 동시에로드 할 수 있습니까? –

+0

이것은 가능할 수 있습니다, 나는 이것을 검사 할 것입니다. – martin

1

바이트로 [] 지퍼를로드 할 때 얻을 수있는 것은 어셈블리가 아닌 지퍼의 바이트 []입니다. 먼저 지퍼를 압축 해제하십시오. 무료 타사 라이브러리 인 http://dotnetzip.codeplex.com과 같은 것을 사용하여 모든 .NET 응용 프로그램 내에서 zip 파일을 만들고 읽을 수 있습니다. . .

string unpackDirectory = "ExtractedFiles";  
    using (ZipFile zip1 = ZipFile.Read(zipToUnpack))  
    { 
     // here, we extract every entry, but we could extract conditionally   
     // based on entry name, size, date, checkbox status, etc.    
     foreach (ZipEntry e in zip1)   
     {    
      e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);   
     }  
    } 
+0

나는 zip을 바이트 []로로드하지 않는다. SharpZipLib을 사용하여 zip에서 dll을 바이트 []로로드한다. – martin

+0

모델 유형을 소유하고 있는가? 예 1. 코드 샘플을 제공 할 수 있는가 2. 어떤 속성이 적용 되었는가? xslt 변환 기술을 사용하고 있습니까? 그 타입 참조는 다른 어떤 타입입니까? XmlSerializer의 다른 ctor를 사용하여 알려진 유형을 전달해야 할 수 있습니다 ... –

관련 문제