我尝试按照以下步骤操作:Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI 1.我将C#Dll命名为TestLib:
namespace TestLib
{
public class TestClass
{
public float Add(float a, float b)
{
return a + b;
}
}
}
2。然后我创建名为WrapperLib的C ++ / CLI Dll并添加对C#TestLib的引用。
// WrapperLib.h
#pragma once
using namespace System;
using namespace TestLib;
namespace WrapperLib {
public class WrapperClass
{
float Add(float a, float b)
{
TestClass^ pInstance = gcnew TestClass();
//pInstance
// TODO: Add your methods for this class here.
return pInstance->Add(a, b);
}
};
}
C + 3.对于check check示例,我创建了C ++ / CLI控制台应用程序并尝试调用此代码:
// ConsoleTest.cpp : main project file.
#include "stdafx.h"
using namespace System;
using namespace WrapperLib;
int main(array<System::String ^> ^args)
{
Console::WriteLine(L"Hello World");
WrapperClass cl1 = new WrapperClass();
return 0;
}
但是我收到了一些错误:
error C2065: 'WrapperClass' : undeclared identifier C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp 11 1 ConsoleTest
error C2146: syntax error : missing ';' before identifier 'cl1' C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp 11 1 ConsoleTest
error C2065: 'cl1' : undeclared identifier C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp 11 1 ConsoleTest
error C2061: syntax error : identifier 'WrapperClass' C:\Projects\TestSolution\ConsoleTest\ConsoleTest.cpp 11 1 ConsoleTest
嗯,我知道某个地方,我错过了,但在哪里?
答案 0 :(得分:2)
根据@Ben Voigt的建议,我相信你的代码应该看起来像这样:
// ConsoleTest.cpp : main project file.
#include "stdafx.h"
#include "WrapperLib.h"
using namespace System;
using namespace WrapperLib;
int main(array<System::String ^> ^args)
{
float result;
Console::WriteLine(L"Hello World");
WrapperClass cl1;
result = cl1.Add(1, 1);
return 0;
}
如果您不包含包装器库的头文件,C ++编译器将永远不会找到它的功能,您将继续获得之前显示的错误。
答案 1 :(得分:1)
这不是很好的C ++,看起来像Java或C#。
在C ++ / CLI中创建新对象的正确语法是
WrapperClass cl1;
或
WrapperClass^ cl1 = gcnew WrapperClass();
C ++有堆栈语义,你必须告诉编译器你是否想要一个自动放置在函数末尾的本地对象(第一个选项),或者一个可以活得更久的句柄(第二个选项,使用{{1 }和^
)。