首先得有一個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();
}
}