目前,我所工作的公司正在为其所有软件实施新的图形用户界面。新的GUI将在WPF中实现,这需要我们的许多旧软件与.NET Framework进行互操作。我最近被赋予了为用本机C ++编写的软件实现WPF接口的职责。
我决定在C ++ / CLI中实现一个包装器,它将包装本机C ++代码。然后,包装器获得的功能将在C#中使用。
我遇到的问题是,无论何时我从C ++ / CLI项目引用头文件(位于本机C ++项目中),我都会遇到许多错误(见下文)。这是一个问题,因为当独立构建项目时,本机代码编译时没有错误。
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(16): error C2061: syntax error : identifier 'DWORD'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(17): error C2061: syntax error : identifier 'CAtlString'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(17): error C2535: 'CFExeption::CFExeption(void)' : member function already defined or declared
2> C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(16) : see declaration of 'CFExeption::CFExeption'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(18): error C2146: syntax error : missing ';' before identifier 'GetErrorText'
2>C:\Users\ABGZAMANK\Music\15.02.2013\DeskUpdate\Dev\Source\Libraries\DeskUpdateCore.dll\Sources\FileOperation.h(18): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
等...
答案 0 :(得分:1)
如果抱怨DWORD
未被定义,则可能是您错过了Windows标头。在添加库的标题之前,请尝试添加#include <windows.h>
。 (或修改FileOperation.h以包含windows.h本身。)
回答'本机C ++是否与C ++ / CLI完全兼容?',答案是'大部分'。如果您在C ++中定义了C ++ / CLI中的语言关键字,那么您将遇到问题。例如,int gcnew = 1
是完全有效的C ++,但在C ++ / CLI中根本不起作用,因为gcnew
是一个关键字。但总的来说,你应该没问题。
从您的问题来看,听起来您正在使用所有C ++代码,并将其编译到C ++ / CLI项目中。如果这是一个现有的测试库,另一个选择是将C ++代码保持为非托管DLL,并从C ++ / CLI调用非托管DLL,而不是在同一个项目中将它们推到一起。也就是说,我的偏好是做你正在做的事情,将C ++代码编译成托管程序集。