2016-06-28 10 views
1

Ich habe ein einfaches Programm, das ich von einem Schema erstellen möchten:Kann nicht XSD aus exe erstellen

public class Program 
{ 
    public Foo f = new Bar(); 
} 
public abstract class Foo { } 
public class Bar : Foo {} 

Das Programm kompiliert Bußgeld gegen .NET 4.0 (x86) auf einem 64-Bit-System. Es hat keine externen Verweise auf eine andere Bibliothek (statt natürlich mscorlib). Jetzt möchte ich ein XSD aus dieser Versammlung mit diesem Befehl erstellen:

xsd pathToAssembly/ConsoleApplication1.exe 

, die gibt mir dies:

Microsoft (R) Xml Schemas/DataTypes support utility
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
Copyright (C) Microsoft Corporation. All rights reserved.

Jedoch habe ich einen Fehler:

Could not load file or assembly 'ConsoleApplication1.exe' or one of its dependencies. An attempt was made to load a program with an incorrect format.

die in der Regel verursacht wird durch verschiedene Laufzeiten. Da mein Projekt aber auch .NET 4 und XSD-tool verwendet, bin ich verwirrt, warum ich das Schema nicht erstellen kann.

Ich habe bereits versucht, XSD aus dem Verzeichnis aufzurufen, in dem sich die Baugruppe befindet, die den gleichen Fehler verursacht.

Ich verwende XSD von Visual Studio 2010 innerhalb eines 64-Bit-Windows 8.1.

EDIT: Der Pfad zu XSD ist dies: C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin/NETFX 4.0 Tools/xsd.exe

+0

Die Fehlermeldung weist auf ein 32/64 Bit-Problem hin. Ist es eine ausführbare 64-Bit-Datei, im Gegensatz zu AnyPCU? – CodeCaster

+0

Nein, es kompiliert für x86. – HimBromBeere

+0

https://social.msdn.microsoft.com/Forums/en-US/2a5f085a-eaf5-4c2c-9d1d-ebfcaecc21d6/xsdexe-does-not-work-for-x86-dlls-on-a-windows-x64 -system? forum = xmlandnetfx – CodeCaster

Antwort

1

Es wird eine 32 ist und eine 64-Bit-Version von Xsd.exe, und die, die laufen gelassen werden, hängt von Ihren Pfadvariablen.

Zum Beispiel das Windows SDK V7.0A stellt die Tools auf diesen Pfaden:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\xsd.exe 
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\xsd.exe 

Wenn Sie nun die entweder von denen aus:

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\xsd.exe" "ConsoleApplication1.exe" 

Es wird den Fehler geben gezeigt. Das liegt daran, dass diese Assembly (Xsd.exe, nicht ConsoleApplication1.exe) mit "AnyCPU" kompiliert wird und in 64-Bit auf einem 64-Bit-System ausgeführt wird. Dies führt zu dem angezeigten Fehler, da ein 64-Bit-Prozess keine 32-Bit-Assembly laden kann.

Sie können dies umgehen, indem Sie die 32-Bit-Datei Xsd.exe auch auf x86 setzen. Sie können so von einer erhöhten Eingabeaufforderung tun:

corflags "Path\To\xsd.exe" /32BITREQ+ /Force 

Beachten Sie, dass diese die Unterschrift der Gruppe ungültig, aber das wird nicht die Funktionalität beeinträchtigt. Sie möchten dies nicht auf der ursprünglichen Xsd.exe tun, aber auf einer Kopie davon.

Jetzt läuft diese Assembly immer als 32-Bit-Prozess und kann Ihre x86-Assembly problemlos laden.

+0

Allerdings eine letzte Frage: Was meinst du mit "ungültig die Signatur der Baugruppe"? Meins ist unterschrieben, also wird dies das beeinflussen? – HimBromBeere

+0

Durch Setzen dieses Flags auf der Xsd.exe wird die Signatur von Xsd.exe ungültig, was kein Problem sein sollte. Es hat keinen Einfluss auf Ihre Montage. – CodeCaster

+0

Ich sehe, danke. – HimBromBeere