Tag: pinvoke

通过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#项目中使用C库。 我能怎么做? 更具体一点:出于效率原因,我需要使用strtod函数从字符串中提取双值(如“9.63074,9.63074 -5.55708e-006 0,01477.78”)。 如果您有关于如何优化此操作的建议,请不要害羞,但主要问题仍然是标题指定。

在unit testing中使用StringBuilder进行PInvoking

我有一个C DLL我是PInvoking。 主要目标是获取39个字符的GUID字符串,例如abcd-abcd-abcd-abcd-abcd-abcd-abcd-abcd 。 我首先调用一个方法来获取这个字符串的大小,我希望它是39个字符,然后我调用另一个函数传递一个容量为39的StringBuilder : [DllImport(“test.dll”)] public static extern int get_size(); [DllImport(“test.dll”)] public static extern void get_string(StringBuilder result); 我的代码看起来像这样: int size = get_size(); // Returns 40, because it includes the null terminating character. var result = new StringBuilder(size – 1); // Gives it a capacity of 39. Subtracting 1 here because this does not […]

C#中的WinDivert

我想在C#代码中调用5个WinDivert函数,第一reflection:PInvoke这里是签名: internal enum WINDIVERT_LAYER { WINDIVERT_LAYER_NETWORK = 0, /* Network layer. */ WINDIVERT_LAYER_NETWORK_FORWARD = 1 /* Network layer (forwarded packets) */ } internal const UInt64 WINDIVERT_FLAG_SNIFF = 1; /* * typedef struct { UINT32 IfIdx; UINT32 SubIfIdx; UINT8 Direction; } WINDIVERT_ADDRESS, *PWINDIVERT_ADDRESS; * */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] internal struct WINDIVERT_ADDRESS { UInt32 IfIdx; UInt32 […]

从Windows C函数返回字符串

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

我应该如何声明这个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]; […]

如何从C#调用C(P / invoke)代码“线程安全”

我有一些使用单个全局变量的简单C代码。 显然这不是线程安全的,所以当我使用P / invoke从C#中的多个线程调用它时,事情搞砸了。 如何为每个线程单独导入此函数,还是使其线程安全? 我尝试声明变量__declspec(thread) ,但这导致程序崩溃。 我也试过制作一个C ++ / CLI类,但它不允许成员函数是__declspec(naked) ,我需要(我使用的是内联汇编) 。 我编写multithreadingC ++代码并不是很有经验,所以我可能会遗漏一些东西。 这是一些示例代码: C# [DllImport(“MyDll.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern int SomeFunction(int parameter1, int parameter2); C ++ extern “C” { int someGlobalVariable; int __declspec(naked) _someFunction(int parameter1, int parameter2) { __asm { //someGlobalVariable read/written here } } int __declspec(dllexport) SomeFunction(int parameter1, int […]

为什么DllImport for C bool as UnmanagedType.I1抛出但是作为字节工作

这是一个简单的C代码(VS 2013 C ++项目,“编译为C”): typedef struct { bool bool_value; } BoolContainer; BoolContainer create_bool_container (bool bool_value) { return (BoolContainer) { bool_value }; } 这是我的P / Invoke包装器 public partial class NativeMethods { [DllImport(LibraryName, CallingConvention = CallingConvention.Cdecl)] public static extern BoolContainer create_bool_container([MarshalAs(UnmanagedType.I1)] bool bool_value); } 以下是BoolContainer的托管版本: 首先是抛出MarshalDirectiveException: Method’s type signature is not PInvoke compatible. : public struct BoolContainer […]