不能从exe创建XSD

本文关键字:XSD 创建 exe 不能 | 更新日期: 2023-09-27 17:51:23

我有一个简单的程序,我想创建一个模式:

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

该程序在64位系统上对。net 4.0 (x86)编译良好。它没有对任何其他库(当然是mscorlib)的外部引用。现在,我想使用以下命令从该程序集创建XSD:

xsd pathToAssembly/ConsoleApplication1.exe

,它给了我这个:

Microsoft (R) Xml schema/DataTypes支持实用程序
[Microsoft (R) .NET Framework, Version 4.0.30319.1]
版权(C)微软公司版权所有

但是我得到一个错误:

无法加载文件或程序集'ConsoleApplication1.exe'或其中之一它的依赖性。试图加载一个程序不正确的格式。

通常是由不同的运行时引起的。然而,由于我的项目使用。net 4和XSD-tool(显然),我很困惑为什么我不能创建模式。

我已经尝试从程序集所在的目录调用XSD,这会导致相同的错误。

我在64位Windows 8.1中使用Visual Studio 2010中的XSD。

编辑:XSD的路径如下:C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A/Bin/NETFX 4.0 Tools/xsd.exe

不能从exe创建XSD

Xsd.exe有32位和64位版本,运行的版本取决于您的路径变量。

例如,Windows SDK v7.0A将工具放在以下路径:

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

现在当你运行其中一个时:

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

它会显示错误。这是因为该程序集(Xsd.exe,而不是ConsoleApplicaiton1.exe)是针对"AnyCPU"编译的,并且将在64位系统上以64位运行。这将导致您看到的错误,因为64位进程无法加载32位程序集。

您可以通过将32位Xsd.exe也强制为x86来规避此问题。您可以从提升的命令提示符中执行此操作:

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

注意,这将使程序集的签名无效,但不会影响其功能。您将不希望在原始Xsd.exe上执行此操作,而是在它的副本上执行此操作。

现在该程序集始终作为32位进程运行,并且可以愉快地加载x86程序集。