我在C ++中定期编码,对于我正在处理的特定项目,我正在编写一个C ++库,其方法将在C#lib中使用,其方法将在C#app中使用
我在Windows 10上使用Microsoft Visual Studio 2017.
我创建了一个包含3个项目的解决方案:
New Project => Visual C++ => CLR => Class Library
)New Project => Windows Classic Desktop => Class Library (.NET Framework)
)New Project => Windows Classic Desktop => Console App (.NET Framework)
)目前,我只是想让3个项目一起进行通信,而且我似乎在C ++ lib和C#lib之间存在问题。
我的C ++ lib中的代码如下;
cppLib.h
#pragma once
#include <string>
using std::string;
using namespace System;
namespace cppLib {
public ref class cppClass
{
public:
static string test();
static double add(double arg1, double arg2);
};
}
cppLib.cpp
#include "cppLib.h"
namespace cppLib {
string cppClass::test() {
return "Hello World from C++ lib.";
}
double cppClass::add(double arg1, double arg2) {
return arg1 + arg2;
}
}
我的C#lib中的代码如下:
Wrapper.cs
using cppLib;
namespace CsWrapper
{
public class Wrapper
{
//static public string TestCppLib()
//{
// return cppClass.test();
//}
static public double Add(double arg1, double arg2)
{
return cppClass.add(arg1, arg2);
}
public string WrapperTest()
{
return "Hello World from C# lib.";
}
}
}
原样,此代码构建时没有错误也没有警告。所以我可以在C#lib方法static double add(double arg1, double arg2);
中调用我的C ++库中的static public double Add(double arg1, double arg2)
方法,但是如果我尝试在 Wrapper.cs 中取消注释以下代码:
//static public string TestCppLib()
//{
// return cppClass.test();
//}
我收到'cppClass.test(?)' is not supported by the language
错误消息:
Severity Code Description Project File Suppression State
Error CS0570 'cppClass.test(?)' is not supported by the language CsWrapper D:\documents\...\CsWrapper\Wrapper.cs Active
这是什么意思?如何在我的C#lib中从我的C ++库中调用一个方法没有问题,但另一个我不能?我的public string WrapperTest()
方法返回一个字符串,我可以在我的C#app中使用它(它可以工作,我可以显示它),那么为什么我不能在C#lib中调用那个特定的C ++方法呢?这也是我第一次用C#进行编码。
答案 0 :(得分:0)
在C ++ / CLI中,如果C#app / lib要使用该方法,则不能将字符串作为本机C ++模板类型返回,因为C#代码将不知道如何使用它。
必须使用该类型的托管(.Net变体);对于C ++ string
,它是String^
。 ^
表示它是一个ref类(托管)指针。
代码变为:
<强> cppLib.h 强>
#pragma once
#include <string>
using std::string;
using namespace System;
namespace cppLib {
public ref class cppClass
{
public:
static String^ test();
static double add(double arg1, double arg2);
};
}
<强> cppLib.cpp 强>
#include "cppLib.h"
namespace cppLib {
String^ cppClass::test() {
return "Hello World from C++ lib.";
}
double cppClass::add(double arg1, double arg2) {
return arg1 + arg2;
}
}
其余的保持不变。