dll只是类库,类库里定义了什么,静态函数还是类,你都没说明。
如果你的DLL也是用C#写的,那我觉得C#调用DLL是最简单的。
将已编译的DLL引入当前项目,在代码文件中using该DLL的命名空间,然后就像本地一样访问了。
如果DLL里是类,就直接可以用类实例化对象,然后调用传递,如果是静态类,那就不用实例化一步直接调用。
腾讯电脑管家可以帮助修复
a进入管家的首页后,点击右上角的“工具箱”按钮,点击“电脑诊所”
b进入“电脑诊所”找到“软件硬件”点击“丢失dll文件”最后“一键修复”界面
可以根据自己d出的对话框中显示的无法启动程序是丢失的何种dll文件,找到对应的后,鼠标轻轻放在该项上,当出现了“立即修复”按钮后点击“立即修复”按钮。
完成以上步骤后,系统便自行修复了dll文件丢失的故障了,完成了修复
1、将对话框资源初始化使用函数参数的方式传递,然后根据传入参数进行对话框的实例化。
与一般的传递一样,只是将实例化放入DLL的函数中。
2、也可能有其它形式资源参数的传递需求吧。
C#无法直接调用这种参数的函数,C#中你描述的那种二维数组,本质上跟一维数组一致。倒是single[][]跟float是类似的,但是也不能直接传递。
然后具体说说
float arr arr为指向float型的指针
single[] arr arr为single型数组的引用,当传递给API时,会自动传递内部指针,这个指针才真真的指向single型的指针
float arr arr为一个指向float型指针的指针,即arr[]应该是一个float型指针
single[][] arr arr为一个single型数组引用的数组引用,这意味着arr的内部指针指向的是single[]型引用的指针,跟指向single型指针完全是两码事
综上所述,C#不能直接调用Test(float arr,int rows,int cols),你必须使用非安全代码构造一个single[],然后将这个数组传递过去。下面是一个例子
[DllImport("testdll")]
static extern unsafe bool Test(float[] arr, int row, int col);//这里arr要声明为float[],使用起来比较方便
bool CallTest(float[,] arr)
{
int row = arrGetUpperBound(0) + 1;
int col = arrGetUpperBound(1) + 1;
unsafe
{
fixed(float fp=arr)
{
float[] farr=new float[row];
for (int i = 0; i < row;i++ )
{
farr[i] = fp + i col;
}
return Test(farr, row, col);
//如果Test(float arr, int row, int col)这样声明,就要用下面的方法调用
//fixed(float fpp=farr)
//{
// return Test(fpp, row, col);
//}
}
}
}
可以采用导入数值的方法。(如你所说将dll的值导入EXE中)如下所示:
在DLL中:
_declspec(dllexport) float fPointX;
在EXE中:
_declspec(dllimport) float fPointX;
不过此种方法有一个缺陷,只能在一个EXE和一个DLL中导入数据,而不能在一个EXE和多个DLL中共享数据。遇到后一种情况的时候:如果你仍然需要传输数据,可以在每个DLL中定义一个函数来传递数据。例如:CMyClass (在DLL中定义的类,用扩展型MFC动态链接类型)
Class CMyClass
{
public:
float GetPointX();
void GetPointX(float p_PointX);
};
在EXE中:
CMyClass MyClass;
MyClassGetPointX();
或者:
float fX;
MyClassGetPointX(&fX);
注:后一种方法对所有情况都适用。祝好运!
以上就是关于c #如何调用dll并传参全部的内容,包括:c #如何调用dll并传参、求解,怎么主程序和DLL子模块共享数据、mfc 主程序在DLL对话框资源显示之前传递DLL对话框初始化参数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)