无法从exe

时间:2016-06-28 07:04:32

标签: c# xsd

我有一个简单的程序,我想从以下位置创建一个架构:

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架构/数据类型支持实用程序
  [Microsoft(R).NET Framework,版本4.0.30319.1]
  版权   (C)Microsoft Corporation。保留所有权利。

但是我收到错误:

  

无法加载文件或程序集“ConsoleApplication1.exe”或其中一个   它的依赖关系。尝试加载带有的程序   格式不正确。

通常由不同的运行时间引起。但是,由于我的项目也使用了.NET 4和XSD工具(显然),我很困惑为什么我无法创建模式。

我已经尝试从程序集所在的目录调用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

1 个答案:

答案 0 :(得分:2)

有一个32位和64位版本的Xsd.exe,正在运行的版本取决于你的路径变量。

例如,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程序集。