C# 该语言不支持 我在C++中定期编码,对于我现在正在做的具体项目,我正在编写一个C++的LIB,其方法将在C语言中使用,其方法将在C应用程序中使用。
我在Windows 10上使用Microsoft Visual Studio 2017 我创建了一个包含3个项目的解决方案:C# 该语言不支持 我在C++中定期编码,对于我现在正在做的具体项目,我正在编写一个C++的LIB,其方法将在C语言中使用,其方法将在C应用程序中使用。,c#,c++,clr,C#,C++,Clr,我在Windows 10上使用Microsoft Visual Studio 2017 我创建了一个包含3个项目的解决方案: 一个C++/CLI动态库(新项目= > VisualC++ + > CLR= >类库) C库(newproject=>WindowsClassicDesktop=>类库(.NETFramework)) 和一个C应用程序(newproject=>WindowsClassicDesktop=>Console应用程序(.netframework)) 现在,我只是想让这3个项目进
newproject=>WindowsClassicDesktop=>类库(.NETFramework)
)newproject=>WindowsClassicDesktop=>Console应用程序(.netframework)
)现在,我只是想让这3个项目进行通信,我在C++库和C语言库之间似乎有问题。 < >我的C++库中的代码如下: 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);
};
}
#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);
};
}
我的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.";
}
}
}
按原样,此代码生成时既没有错误也没有警告。所以我可以调用我的静态双加(双arg1,双arg2)代码>从我的C++ LIB中,在我的C LyLIB方法>代码>静态公共双加法(双ARG1,双ARG2)< /代码>中,但是如果我试图取消在<强>包装器中的以下代码。
//static public string TestCppLib()
//{
// return cppClass.test();
//}
我得到语言不支持的'cppClass.test(?)
错误消息:
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++语言中调用一个方法,而不是其他问题?我的<代码>公共字符串WrApPrestTest[()> <代码>方法返回一个字符串,我可以在C语言应用程序中使用它(它可以工作,我可以显示它),为什么我不能调用C++中的那个特定C++方法呢?这也是我第一次在C语言中编码,在C++ C++中,如果该方法要被C语言应用程序/LIB使用,字符串不能返回原生C++模板类型,因为C代码不知道如何使用它。p>
必须使用该类型的托管(.Net变量);对于C++ 字符串,它是<代码>字符串^ < /代码>。^
表示它是一个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);
};
}
#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);
};
}
其余部分保持不变。我不确定这是否是错误的原因,但std::string
!=System.String
我是@Neijwiert的。我很确定这就是问题的原因。还有一个旁注:为什么要为C++/CLI库创建包装器类?C++/CLI的全部要点是,您可以直接在托管.NET应用程序中与它进行接口。您不能返回本机C++模板类型,并期望C++代码能够使用它。只有C++编译器才能做到这一点,只有完全相同的编译器版本使用完全相同的编译选项。将返回类型更改为String^
。它是字符串的托管(.Net变量)。string是非托管类型。使用^
表示它是ref类(托管)指针。