2012-06-20 167 views
2

我尝试按照此步骤:Calling C# from C++, Reverse P/Invoke, Mixed Mode DLLs and C++/CLI 1.我让C#DLL的命名TESTLIB:调用C#函数C

namespace TestLib 
{ 
    public class TestClass 
    { 
     public float Add(float a, float b) 
     { 
      return a + b; 
     } 
    } 
} 

2.然后,我创建C++/CLI的Dll名为WrapperLib和添加对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.检查那朵例子中,我创建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

如果编译器告诉你“嗨,出现了一些错误,请修复”,你首先看哪里? :)请告诉我们错误是什么。 –

+0

已修复。我添加了VS输出。如何从本地C++或C右键调用该函数? – Superjet100

回答

1

这不是很好的C++,看起来像Java或C#。

正确的语法C语言创建一个新的对象++/CLI是

WrapperClass cl1; 

WrapperClass^ cl1 = gcnew WrapperClass(); 

C++已经堆栈的语义,你必须告诉编译器是否要一个本地对象自动放置在功能(第一个选项)的末尾,或者可以使用更长寿命的手柄(第二个选项,使用^gcnew)。

+0

我试着用WrapperClass^cl1 = gcnew WrapperClass();但我得到的错误:错误错误C2065:WrapperClass“:未声明的标识符 错误C2065:CL1':未声明的标识符\t 错误C2061:语法错误:标识符 'WrapperClass' – Superjet100

+0

@ Superjet100:您还需要'的#include “WrapperLib.h”' –

+0

但是在这个测试控制台应用程序中,我没有#include“WrapperLib.h” – Superjet100

2

根据@Ben福格特建议,我相信,你的代码看起来有点像这样:

// 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++编译器永远也找不到它的功能并且您将继续收到您之前显示的错误。

+0

我的WrapperLib项目仅包含带有代码和WrapperLib.cpp的WrapperLib.h:#include“stdafx.h”#include“WrapperLib.h”是不是正确? – Superjet100

+0

是的我相信这是正确的,但是你需要将你的WrapperLib头文件包含到你的主项目(你用来测试它的那个项目)中。正如@Mark Simith上面所说的,在本机C++中,如果您没有引用另一个项目,则无关紧要,您仍然需要包含头文件。 – Felipe

+0

此外,也许你可以用你最新的构建错误更新你的问题... – Felipe