从本机C ++或C调用C#函数

时间:2012-06-20 13:30:41

标签: c# c++-cli pinvoke

我尝试按照以下步骤操作: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

嗯,我知道某个地方,我错过了,但在哪里?

2 个答案:

答案 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 }和^)。