使用pinvoke从C#调用非托管C ++代码

时间:2011-06-13 14:55:39

标签: dllimport

我有一个非托管的C ++ dll,我无法访问代码但是有所有方法声明。

为简单起见,请注意.h看起来像这样:

#include <iostream>

#ifndef NUMERIC_LIBRARY
#define NUMERIC_LIBRARY

class Numeric
{
    public:
        Numeric();
        int Add(int a, int b);
        ~Numeric();
};

#endif

和.cpp文件中的方法实现

int Numeric::Add(int a, int b)
{
    return (a + b);
}

我只想在C#代码中用C ++调用add函数:

namespace UnmanagedTester
{
    class Program
    {
        [DllImport(@"C:\CPP and CSharp Project\UnmanagedNumeric\Debug\numeric.dll", EntryPoint = "Add")]
        public static extern int Add(int a, int b);


        static void Main(string[] args)
        {
            int sum = Add(2, 3);
            Console.WriteLine(sum);

        }
    }
}

尝试执行后出现以下错误:

无法在DLL'C:\ CPP和CSharp Project \ UnmanagedNumeric \ Debug \ numeric.dll'中找到名为“添加”的入口点。

我无法更改C ++代码。不知道出了什么问题。 感谢您的帮助。

3 个答案:

答案 0 :(得分:6)

使用PInvoke,您只能调用从Dll导出的全局函数。要使用导出的C ++类,需要编写C ++ / CLI包装器。这是C ++ / CLI类库项目,它公开了纯.NET接口,在内部它链接到非托管C ++ Dll,从这个Dll实例化一个类并调用它的方法。

修改:你可以从这开始:http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8

答案 1 :(得分:2)

如果您需要创建包装器,请查看swig.org。它将为C#等大多数高级语言生成一个。

几分钟前我刚遇到这个程序,同时解决了你的问题。

答案 2 :(得分:2)

要使用C#中的本机C ++类,您需要在它们之间使用C ++ / CLi包装器,如之前的答案所述。要真正做到这一点,它不是很直接。这是我链接,告诉你如何在高级别:C++/CLI wrapper for native C++ to use as reference in C#

如果你对这个很陌生(像我一样),你可能偶然发现1) - 链接部分。要解决这个问题,你可以看到我在这里做了什么(参见我的问题部分):Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols