Visual studio 2015 向托管项目添加本机类

Visual studio 2015 向托管项目添加本机类,visual-studio-2015,c++-cli,Visual Studio 2015,C++ Cli,这可能是因为我缺乏c++/cli知识,但我似乎在任何地方都找不到这个问题 我有一个名为MauldProject的项目,用/CLR编译,它有一个(c++/CLI)REF类,叫做ReCopy.CPP,还有一个名为CPPPCLASEC.CPP.的C++ C++类。 我可以从RefClass调用CppClass的构造函数 但是,我无法从也使用/clr编译的单独项目“OtherProject”调用CppClass。OtherProject只有Other.cpp。 OtherProject有对Managed

这可能是因为我缺乏c++/cli知识,但我似乎在任何地方都找不到这个问题

我有一个名为MauldProject的项目,用/CLR编译,它有一个(c++/CLI)REF类,叫做ReCopy.CPP,还有一个名为CPPPCLASEC.CPP.

的C++ C++类。 我可以从RefClass调用CppClass的构造函数

但是,我无法从也使用/clr编译的单独项目“OtherProject”调用CppClass。OtherProject只有Other.cpp。 OtherProject有对ManagedProject的引用,因此我可以调用RefClass,但即使我能够#包括“CppClass.h”,当我尝试调用CppClass的构造函数时,我也会遇到LNK2019和LNK2028错误

当从非/clr本机类调用它时,我会遇到相同的错误


下面是一个代码示例:

管理项目

RefClass.cpp:

// has a .h file with the constructor declaration & instance variable int test;
#include "CppClass.cpp"
RefClass:RefClass(int test){
    this->test = test;
    CppClass inst(42); //This works
}
// has a .h file with the constructor declaration & instance variable int test2;
CppClass:CppClass(int test2){
    this->test2 = test2;
}
CppClass.cpp:

// has a .h file with the constructor declaration & instance variable int test;
#include "CppClass.cpp"
RefClass:RefClass(int test){
    this->test = test;
    CppClass inst(42); //This works
}
// has a .h file with the constructor declaration & instance variable int test2;
CppClass:CppClass(int test2){
    this->test2 = test2;
}
其他项目

其他.cpp:

#include "CppClass.cpp"
int wmain(/*args*/){
    RefClass^ refinst = gcnew RefClass(64); //This works    
    CppClass inst(42); //This fails, I get LNK2019 & LNK2028 at Other.obj
}

实际错误输出: 注意:这里SQLPrecheckReport是CppClass,appzsqlmigrate.cpp是Other.cpp,appzsqlmigrate是OtherProject的名称

32>appzsqlmigrate.obj:错误LNK2028:未解析的令牌(0A000B59) “公共:uu cdecl SQLPrecheckReport::SQLPrecheckReport(int)” (??0SQLPrecheckReport@@$$FQEAA@H@Z) 在函数“int”中引用 __cdecl wmain(int,wchar\u t**const)”(?wmain@$$hyahqeapea_W@Z)

32>appzsqlmigrate.obj:错误LNK2028:未解析的令牌(0A000B5A) “public:uu cdecl SQLPrecheckReport::~SQLPrecheckReport(void)” (??1SQLPrecheckReport@@$$FQEAA@XZ)在函数“int\uu cdecl”中引用 wmain(int,wchar\u t**const)”(?wmain@$$hyahqeapea_W@Z)

32>appzsqlmigrate.obj:错误LNK2019:未解析的外部符号 “公共:uu cdecl SQLPrecheckReport::SQLPrecheckReport(int)” (??0SQLPrecheckReport@@$$FQEAA@H@Z) 在函数“int”中引用 __cdecl wmain(int,wchar\u t**const)”(?wmain@$$hyahqeapea_W@Z)

32>appzsqlmigrate.obj:错误LNK2019:未解析的外部符号 “public:uu cdecl SQLPrecheckReport::~SQLPrecheckReport(void)” (??1SQLPrecheckReport@@$$FQEAA@XZ)在函数“int\uu cdecl”中引用 wmain(int,wchar\u t**const)”(?wmain@$$hyahqeapea_W@Z)


C++/CLI允许托管代码和非托管代码在同一个DLL中共存,但它们仍然使用通常使用的链接机制

托管代码通过将托管类标记为public并将程序集加载为引用来链接。非托管代码通过在导出DLL中指定
\u declspec(dllexport)
和在导入DLL/EXE中指定
\u declspec(dllimport)
导出函数进行链接

如果你想把它导出为C++类,你需要根据你的错误信息,将< Copy>包含“CPppCalth.h”< /C> >,它看起来像你已经在做的那样。您需要指定那些
declspec
属性;通常的方法是在项目设置中为ManagedProject定义一个预处理器符号,但不为其他项目定义预处理器符号,然后关闭该符号,将其定义为
\u declspec(dllexport)
\u declspec(dllimport)


另一种方法是将非托管类包装在托管类中,并使用.Net机制处理链接。这将使链接变得更简单,这正是C++/CLI的设计初衷(尽管包装器通常由C#而不是更多的C++/CLI使用)。

C++/CLI允许托管代码和非托管代码在同一DLL中共存,但它们仍然使用通常使用的链接机制

托管代码通过将托管类标记为public并将程序集加载为引用来链接。非托管代码通过在导出DLL中指定
\u declspec(dllexport)
和在导入DLL/EXE中指定
\u declspec(dllimport)
导出函数进行链接

如果你想把它导出为C++类,你需要根据你的错误信息,将< Copy>包含“CPppCalth.h”< /C> >,它看起来像你已经在做的那样。您需要指定那些
declspec
属性;通常的方法是在项目设置中为ManagedProject定义一个预处理器符号,但不为其他项目定义预处理器符号,然后关闭该符号,将其定义为
\u declspec(dllexport)
\u declspec(dllimport)


另一种方法是将非托管类包装在托管类中,并使用.Net机制处理链接。这将使链接更简单,这正是C++/CLI的设计初衷(尽管包装器通常会被C#使用,而不是更多的C++/CLI)。

CLR为模块提供了出色的支持,但它不会将这种支持追溯到非托管代码。你必须在这里做普通的C++舞蹈,把C++类放在一个普通的静态库或DLL项目中,并链接它们的.LIBs,这样可以共享本机代码。@ HANSPASANT,我现在看到这个问题不与C++/CLI有关。抱歉,如果这看起来很明显,我对使用DLL和库是完全陌生的。你能告诉我这样做的目的是:“将C++类放在一个普通的静态库或DLL项目中,并链接它们的.LIBs,以便可以共享本机代码”?到目前为止,我所尝试的并没有解决这些错误……CLR为模块提供了极好的支持,但它也没有追溯性地将这种支持添加到非托管代码中。你必须在这里做普通的C++舞蹈,把C++类放在一个普通的静态库或DLL项目中,并链接它们的.LIBs,这样可以共享本机代码。@ HANSPASANT,我现在看到这个问题不与C++/CLI有关。抱歉,如果这看起来很明显,我对使用DLL和库是完全陌生的。你能告诉我这样做的目的是:“将C++类放在一个普通的静态库或DLL项目中,并链接它们的.LIBs,以便可以共享本机代码”?我试过的