天天看點

c#調用c++生成dll檔案中的類方法

首先得有一個c++程式,我們這裡叫test.

其中代碼

test.h

{

class MyMath

{

public:

__declspec(dllexport) float Mysub(float a, float b);

};

}

test.cpp

{

#include "stdafx.h"

#include "test.h"

extern "C"__declspec(dllexport) float MyAdd(float a, float b)

{

return (a + b);

}

 float MyMath::Mysub(float a, float b)

{

return a - b;

}

}

test.def

{

LIBRARY

EXPORTS 

Mysub @1

MyAdd @2

}(注:這個檔案很重要,如果沒有的話,在c#中調用類中的函數sub的時候,就會找不到sub入口點,不過還有一種解決方法,就是EntryPoint="[email protected]@@[email protected]".其中引号中的内容可以在test.exp檔案中找到。)

但是如果有這個檔案的話就可以省去找EntryPoint那裡引号中的内容。

然後我們有一個c#程式,我們這裡叫dlltest.

其中代碼

建立了一個類MyMath.cs(名字不重要),它主要是為了接受c++中的方法,這樣在c#通過這個類找到那些方法就比較友善了。

MyMath.cs

{

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Runtime.InteropServices;

namespace dlltest

{

    class MyMath

    {

        [DllImport("test.dll", EntryPoint = "Mysub")]

        public static extern float Mysub(float a,float b);

        [DllImport("test.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "MyAdd")]

        public static extern float MyAdd(float a,float b);

    }

}

}

主函數Program.cs

{

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Runtime.InteropServices;

{

    class Program

    {

            static void Main(string[] args)

            {

              Console.WriteLine(MyMath.MyAdd(1, 2));

              Console.WriteLine(MyMath.Mysub(5,1));

              Console.ReadKey();

            }

}