2015-02-12 196 views
0

我在Visual Studio 2012中的解决方案有三个项目。一个WinForms项目和两个VC++项目(库)。最初所有的开发都是在Windows 7 Professional 32 Bit上完成的。但最近,我的系统已更新为Windows 7 Professional 64位。从32位变为64位

我的应用程序通过设置为AnyCPU的Active Solution Platform成功运行。但是,当应用程序启动时,我执行了一些调用底层VC++库的操作,该应用程序崩溃时,dll的FileNotFoundException

那么我应该将主动解决方案平台更改为x64?或者可以保持原样。

我试图将活动解决方案平台更改为x64。但该DLL没有建立。我得到一个error LNK2019: unresolved external symbol

我从来没有使用过64位之前。我应该怎样做我的应用程序构建?

未找到的符号出现在静态库的第三个VC++项目中。

WinForms依赖于dll,而dll依赖于静态lib。

更新:

当构建配置设置为AnyCPU,我得到一个System.BadImageFormatException。根据其他信息,它说无法加载文件或程序集dll_name,....。尝试加载格式不正确的程序。

+0

为什么你不告诉我们更多关于你遇到的错误。什么符号没有解决? – 2015-02-12 04:43:20

+0

除非应用程序在64位模式下运行有令人信服的理由,否则将其保留为32位可能会更简单。这意味着将主动解决方案平台设置为x86。 – 2015-02-12 05:06:42

+1

64位进程无法调用32位dll,反之亦然。你必须确保程序中的所有调用函数都是64位版本 – 2015-02-12 05:11:34

回答

1

AnyCPU平台的选择建立CPU独立的.NET代码。这意味着它将在32位Windows上作为x86代码运行,但在64位Windows上作为x64代码运行。

Visual C++没有AnyCPU的任何等价物。这些项目必须是32位或64位。据推测,您的解决方案配置为在AnyCPU被选中时将它们构建为32位DLL。这意味着在64位机器上,.NET代码将以64位运行,但DLL仍然是32位,并且由于64位进程无法加载32位DLL,因此它获胜没有工作。

您可以通过将Active Solution Platform设置为x64或将其设置为x86来修复此。除非你有特定的原因让代码以x64运行(例如,它需要更大的地址空间,或者它在32位平台上不能很好地运行),否则选择x86通常会更简单,因为这样做会起作用在32位和64位Windows上,并且不需要对最初为32位Windows开发的现有代码进行任何修改。

也可以在单个解决方案中构建32位和64位DLL并在运行时加载.NET代码。但是,这更复杂。