Tag: interop

通过Interop / pinvoke传递C#回调函数

我正在编写一个C#应用程序,它使用Interop服务来访问本机C ++ DLL中的函数。 我已经使用了大约10种不同的function。 现在我不知道如何处理将回调作为参数传递,以便DLL可以调用我的代码。 这是DLL的函数原型: typedef void (WINAPI * lpfnFunc)(const char *arg1, const char *arg2) 并且允许我传递上述类型的函数: int WINAPI SetFunc(lpfnFunc f) 这是委托和函数定义的C#代码: public delegate void Func(string arg1, string arg2); public static void MyFunc(string arg1, string arg2) 这是我的SetFunc Interop函数的C#代码: [DllImport(“lib.dll”, CharSet = CharSet.Ansi)] public static extern int SetFunc(Func lpfn); 最后这里是我调用SetFunc函数并将其传递给我的回调的代码: SetFunc(new Func(MyFunc)); 不幸的是,我的function应该被调用。 SetFunc函数的返回值是返回Success的错误代码,所以要么它没有调用我的函数,要么因为我的代码错误而无法正常工作。

如何将数组从.Net传递给C?

我试图利用一个用C语言编写的开源库,将其包装并将其暴露给.Net。 无论如何,我不是C专家。 到目前为止,我已经设法从F#调用用C语言编写的演示代码。 我设法通过遵循本指南然后填写空白来实现这一目标。 我已经调整了C代码以期望传递给它的int,所以我至少可以从F#中获取标量值到C.但是没有返回值。 但使用数组要复杂得多。 我的C代码是 extern “C” { __declspec(dllexport) void DisplayHelloFromDLL(int i) { //printf(“Hello from DLL !\n”); cout << "You gave me … an int: " << i <n = n; data->m = m; data->P = csc_matrix(data->n, data->n, P_nnz, P_x, P_i, P_p); data->q = q; data->A = csc_matrix(data->m, data->n, A_nnz, A_x, A_i, A_p); […]

无法从C应用程序访问C ++ DLL中的变量

我坚持修复传统的Visual C ++ 6应用程序。 在我放的C ++ DLL源代码中 extern “C” _declspec(dllexport) char* MyNewVariable = 0; 这导致MyNewVariable在导出表中显示(很好地未修饰)(如dumpbin / exports blah.dll所示)。 但是,我无法弄清楚如何声明变量,以便我可以在C源文件中访问它。 我尝试了各种各样的东西,包括 _declspec(dllimport) char* MyNewVariable; 但这只是给我一个链接器错误: 未解析的外部符号“__declspec(dllimport)char * MyNewVariable”(__ imp_?MyNewVariable @@ 3PADA) extern “C” _declspec(dllimport) char* MyNewVariable; 正如Tony所建议的(以及我之前尝试过的)会产生不同的预期装饰,但仍未删除它: 未解析的外部符号__imp__MyNewVariable 如何编写声明,以便可以从C应用程序访问C ++ DLL变量? 答案 由botismarius和其他人确认(非常感谢所有),我需要链接DLL的.lib。 为了防止名称被破坏,我需要声明它(在C源代码中)没有装饰器,这意味着我需要使用.lib文件。

c-fortran互操作性 – 带指针的派生类型

我有很长的fortran代码,必须从python中使用。 我决定做Fortran-> C-> Python接口。 我遇到了一个问题:我在包含的Fortran模块中派生了类型 double precision, allocatable 输入成员。 当我尝试用ifort编译时,我得到了(与gfortran类似): Each component of a derived type with the BIND attribute shall be a nonpointer, nonallocatable data component with interoperable type and type parameters 这实际上与英特尔编译器文档和Fortran 2003标准一致:第15.2.5点。 有没有办法访问带有allocatable或指针的Fortran“type”?

从Windows C函数返回字符串

我是C和C ++中纯Windows API级函数的完全新手,并且最近一直在尝试使用.NET互操作性。 我已经构建了一个简单的库,它已经成功地将数值(int / float等)返回给.NET调用者,但是我没有运气好的字符串。 我尝试了各种不同的数据类型,但似乎都没有:LPSTR,LPCSTR,LPCTSTR和LPCWSTR。 不可否认,我没有尝试过char *。 此外,一旦设置了一个方法来返回一个字符串,它是否需要.NET作为特定数据类型进行编组,还是可以简单地直接读入System.String对象? 我已经尝试解析为IntPtr然后转换为字符串,但这不起作用。

Python C互操作性

我希望将现有的C(纯C,无.C ++)库包装到Python中,以便我可以从Python脚本中调用它。 各种可用的方法(C Api,SWIG等)最合适?

C#与非托管C库之间的互操作

我在DLL中有一个小C库,我需要调用它的一些方法。 它使用指针和一些结构,但在其他方面非常简单。 问题是我在.NET与非托管世界的互操作上并不是非常了解,到目前为止我的尝试仍然存在内存访问冲突exception(可能是因为我没有得到指针非常正确)。 有没有人能给我一些指针(哦,双关语!)以最好的方式来解决这个问题? 谢谢 extern vconfig_t *Pobsopen(Ppoly_t ** obstacles, int n_obstacles); extern int Pobspath(vconfig_t * config, Ppoint_t p0, int poly0, Ppoint_t p1, int poly1, Ppolyline_t * output_route); extern void Pobsclose(vconfig_t * config); struct vconfig_t { int Npoly; int N; Ppoint_t *P; int *start; int *next; int *prev; }; typedef struct Ppoly_t { Ppoint_t *ps; […]

如何使用WCHAR * out参数从C#调用C函数?

我在编组方面遇到了一些问题,我自己也搞不清楚了。 我已经搜索了这个主题,但还没有运气,所以基本上我试图从我的托管C#应用程序调用非托管C函数。 C函数的签名如下所示: long MyFunction(WCHAR* upn, long upnSize, WCHAR* guid, long* guidSize); 我没有访问.dll文件,我只知道该函数正在暴露使用,我知道函数应该做什么,但我不知道里面发生了什么,所以函数收到一个WCHAR * upn持有UserPricipalName和长度与提供的UPN的长度。 还传递WCHAR指针,其中该函数写回与传递的UPN相关联的相应GUID。 guidSize指针提供指针的大小,如果它太小,则写入的GUID未完全写入。 如果一切顺利,函数应返回0(当从c#调用时,它从未发生过) 现在我调用和调用此函数的努力如下所示: [DllImport(@”MyDll.dll”, EntryPoint = “MyFunction”, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public static extern long MyFunction(IntPtr upnPtr, long upnSize, [Out, MarshalAsAttribute(UnmanagedType.LPWStr) ] StringBuilder guidPtr, IntPtr guidSizePtr); //my attempt to call the Dll’s exposed function string upn = […]

如何编写用于调用Win32函数的通用C函数?

为了允许从脚本语言(用C编写)访问Win32 API,我想编写如下函数: void Call(LPCSTR DllName, LPCSTR FunctionName, LPSTR ReturnValue, USHORT ArgumentCount, LPSTR Arguments[]) 一般来说,它会调用任何Win32 API函数。 (LPSTR参数基本上用作字节数组 – 假设它们的大小正确,以便在函数外部采用正确的数据类型。另外我认为需要一些额外的复杂性来区分指针和非指针参数但我为了这个问题的目的,我忽略了这一点。 我遇到的问题是将参数传递给Win32 API函数。 因为这些是stdcall我不能使用varargs所以’Call’的实现必须提前知道参数的数量,因此它不能是通用的… 我想我可以使用汇编代码(通过循环遍历参数,将每个参数推送到堆栈)来实现这一点但是在纯C中这是可能的吗? 更新:我已经标记了现在已经接受的“不可能”答案。 如果基于C的解决方案曝光,我当然会改变这一点。 更新: ruby / dl看起来可能使用合适的机制实现。 任何有关这方面的细节将不胜感激。

我应该如何声明这个C结构用于互操作?

我必须在我正在开发的应用程序中使用遗留的C例程。 这里的代码可行,但我必须将几乎所有字段转换为char数组才能使用它。 还有更好的方法吗? 我试过一些使用字符串的版本,但都无济于事。 这是在原始头文件中找到的代码… typedef struct PXUCAMR { char xumrversaocomc01; char xumrretcomc02[2]; char xumrretusuc02[2]; char xumrcodfalhac05[5]; char xumrfiller1c01; char xumrtipoambclic01; char xumrambientec01; char xumrconvertec01; char xumroperacaoc01; char xumropcaoexec01; xumrcom_t *xumrhandleconnb31; char xumrreshconnc04[4]; long xumrtamdadosb31; char xumrtransacaosrvc08[8]; char xumrtransrvdb2c04[4]; char xumrpgmservidorc08[8]; char xumrversaopgmsrvc02[2]; char xumrconectardbc01; char xumrusuariosrvc08[8]; char xumrsenhasrvc08[8]; char xumridcriptc08[8]; char xumrpgmclientec08[8]; char xumrversaopgmclientec02[2]; […]