话不多说,先用c做一个测试代码:
主要的功能是建立一个大小可变的一维和二维动态指针,并输出相关内容
// An highlighted block
#include <iostream>
int dllNameArryDimOne(int* a, int length);
int dllNameArryDimTwo(int** a, int row, int column);
int main()
{
#pragma region 一维动态数组的调用
int* mArrayDimOne;
mArrayDimOne = (int*)calloc(4, sizeof(int));
if (mArrayDimOne == NULL)
{
std::cout << "分配空间不成功";
}
else
{
for (int i = 0; i < 4; i++)
{
mArrayDimOne[i] = i;
}
std::cout << dllNameArryDimOne(mArrayDimOne, 4);
}
free(mArrayDimOne);
#pragma endregion
#pragma region 二维数组的调用
int** mArrayDimTwo;
mArrayDimTwo = (int**)calloc(3,sizeof(int));
if (mArrayDimTwo==NULL)
{
std::cout << "分配空间不成功";
}
else
{
for (int i = 0; i < 3; i++)
{
mArrayDimTwo[i] = (int*)calloc(4,sizeof(int));
}
mArrayDimTwo[2][3] = 3;
}
std::cout<< dllNameArryDimTwo(mArrayDimTwo,3,4);
free(mArrayDimTwo);
#pragma endregion
}
int dllNameArryDimOne(int* a,int length)
{
int arrayFirst = a[0];
int arrayLost = a[length-1];
return arrayLost;
}
int dllNameArryDimTwo(int **a, int row, int column)
{
int arryFirst = **a;
int arryLost = *(*(a + row-1) + column-1);
return arryFirst + arryLost;
}
运行输出结果:
制作dll文件如下:
主函数内容:
int dllname(int** a,int row,int column)
{
int arryFirst = **a;
int arryLost = *(*(a + row - 1) + column - 1);
return arryFirst + arryLost;
}
头文件:
extern "C" _declspec(dllexport) int dllname(int** a, int row, int column);
在C#中调用dll文件
[DllImport("testDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
internal static extern unsafe int dllname(int*[] a,int row,int column);
程序中无法直接使用指针,因此建立了一个二维数组,并使用不安全代码完成
int outPutnum=0;
int[,] a = new int[3,4];
a[2, 3] = 2;
a[0, 0] = 3;
try
{
unsafe
{
fixed (int* ap = a)
{
int*[] arr = new int*[3];
for (int i = 0; i < 3; i++)
{
arr[i] = ap + i * 4;
}
outPutnum = DLL.NetModulDll.dllname(arr, 3, 4);
}
}
}
catch (Exception message)
{
MessageBox.Show(message.Message);;
}
Console.WriteLine(outPutnum);
调用结果显示如下