Tag: 互操作

在.NET中使用C回调函数

我正在使用.NET内部的C库这一切都很好用。 但我遇到了回调函数的麻烦。 我有这个C代码: Bool someCallBack(const char *name, int reason) { //some logic here return True; } int main(int argc, char **argv){ SetCallback(someCallBack) } 在头文件中,SetCallback定义为: typedef Bool (*CallbackType)(const char *name, int reason); #define DLL_USE __declspec(dllimport) DLL_USE void SetCallback(CallbackType callBack); 当我执行一个触发回调的函数时,这一切都在C中正常工作。 现在我想从.NET中做到这一点 在.NET中我有这个代码 _ Public Shared Sub SetCallback(ByVal callBack As CallbackType) End Sub Delegate Function CallbackType(ByVal name […]

Marshal是一个双char指针返回值

我正在使用的AC库有一个函数,它返回一个指向char指针数组的指针: extern char** getIds(); 使用示例: char **list, **list_save; list_save = list = getIds(); while (list && *list) { printf(“Id: %s\n”, *list); list++; } freeIds(list_save); 其中freeIds也来自C库,并释放在getIds期间分配的内存。 它们也提供.Net Interop程序集,但它不会导入getIds函数。 我可以访问interop汇编源代码。 我的程序是在C#中,所以我想知道是否可以在interop程序集中添加一个导入,它应该是什么样的,以及我的C#代码调用该函数的样子。 我对dll导入的猜测是: [DllImport(“foo.dll”, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr getIds(); 但是我无法让C#调用它,因此我不知道dll导入是否正确。

C NULL是否等于C ++ 11 nullptr

我喜欢使用nullptr而不是NULL。 现在我调用一个C函数(在本例中来自libjansson )。 C中的NULL是实现定义的 。 对于nullptr我发现“空指针常量是整数类型的整数常量表达式(5.19)rvalue,其值为零”。 所以最安全的事情是: auto string_obj=json_object_get(m_handle,name); if(string_obj!=NULL) { auto string=json_string_value(string_obj); if(string!=NULL) {return string;} } return nullptr; 我真的需要它还是可以更简单地做到: auto string_obj=json_object_get(m_handle,name); if(string_obj!=nullptr) { return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr } return nullptr;