C# · 12月 26, 2021

C#使用C库的提示

我有一个C的库,我想从C#使用.

从我从互联网上收集到的信息,one idea将它包装在一个C DLL里面,而DllImport就是这样的.

问题是我想要调用的函数有一个非常讨厌的参数集:包括对函数的引用(它将是一个.NET函数)和一些数组(一些写,一些读).

int lmdif(int (*fcn)(int,int,double*,int*),int m,int n,double* x,double ftol,double xtol,double gtol,int maxfev,double epsfcn,double factor)

给我一个这样的界面,我应该注意些什么? (也请解决方案)

你为什么不…

– 在C#中重写?我开始了,但是它已经是从FORTRAN机器翻译过来的,我不太喜欢编码我不明白的东西.

– 使用an existing .NET library?我正在尝试,但结果并不完全相同

– 在C中重新编译?我在想,但看起来很痛苦

解决方法 唯一的“讨厌”参数是函数指针.但幸运的是,.NET通过代理来处理好它们.

唯一的问题是调用约定.在C#中,它只发出一个类型(iirc stdcall),而C代码可能会期望cdecl.后一个问题可以通过(或使用Reflection.Emit)在IL级别处理.

Here is some code,它通过Reflection.Emit(这是为了帮助了解什么psuedo属性需要放置在委托的Invoke方法).