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

问题描述

| 我有一个不受管理的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 \'中找不到名为\'Add \'的入口点。 我不能更改C ++代码。不知道出了什么问题。 感谢您的帮助。     

解决方法

        使用PInvoke,您只能调用从Dll导出的全局函数。要使用导出的C ++类,您需要编写C ++ / CLI包装器。这是C ++ / CLI类库项目,它公开了纯.NET接口,在内部将其链接到非托管C ++ Dll,从该Dll实例化一个类并调用其方法。 编辑:您可以从这里开始:http://www.codeproject.com/KB/mcpp/quickcppcli.aspx#A8     ,        如果需要创建包装器,请访问swig.org。它将为大多数高级语言(如C#)生成一种语言。 几分钟前,我刚遇到这个程序,却遇到了同样的问题。     ,        要使用来自C#的本机C ++的类,您需要在两者之间使用C ++ / CLi包装器,如先前的回答所述。要真正做到这一点,并不是很简单。这里是我的链接,它告诉您如何在更高层次上进行操作:本机C ++的C ++ / CLI包装器在C#中用作参考。 如果您对此不熟悉(像我一样),则可能会偶然发现1)-链接部分。要解决该问题,您可以看到我在这里的操作方式(请参阅我的问题部分):尽管链接了带有导出符号的.lib文件,但链接错误仍从托管C ++链接到非托管C ++。