Tag: c#

从C转换为C#,还是制作DLL?

我是C#编程的新手。 我有一个用C语言修改的程序,我现在需要从C程序中获取字符串数组并将其传递给C#程序,以便它可以使用这些值查询Oracle数据库。 该程序用于从连接到计算机的所有iButton设备获取序列号。 这是C代码 // function prototypes void UnLoadTMEX(void); short LoadTMEX(void); // globals static FARPROC Get_Version, TMGetTypeVersion, TMEndSession; static FARPROC TMSetup, TMNext, TMRom, ExtendedStartSession; static FARPROC TMReadDefaultPort; long (__fastcall *TMExtendedStartSession)(short,short,void *); static HINSTANCE hInst; unsigned char state_buf[5125]; //————————————————————————– // Main of iSerial64 // void main(int argc, char **argv) { char refresh,buf[200]; short flag,i,didsetup=0; short ROM[9]; […]

如何从DLL设置委托/回调(C和C#之间的互操作)

我有一个静态库(* .a for iOS),它包含一些我需要分配给C#回调的函数。 代码在没有回调的情况下工作正常,但是当我将委托添加到结构时,它失败并出现以下错误: ArgumentException: The specified structure must be blittable or have layout information. Parameter name: structure at FMOD_Listener.LoadPlugins () [0x00000] in :0 at FMOD_Listener.Initialize () [0x00000] in :0 (Filename: currently not available on il2cpp Line: -1) 这是本机代码(C): extern “C” { typedef void (F_CALLBACK *basic_callback) (int *value1); typedef struct telephone { int area_code; […]

在C#和C之间编组嵌套结构 – 简单的HelloWorld

我遇到了一个问题,其中来自父结构的数据被正确编组,但子结构中的数据不是。 C中的结构定义和函数: struct contact_info { char cell[32]; char home[32]; }; struct human { char first[32]; char last[32]; struct contact_info *contact; }; __declspec(dllexport) int __cdecl say_hello(struct human *person); __declspec(dllexport) int __cdecl import_csv(char *csvPath, struct human *person); C#P / Invoke代码: [StructLayout(LayoutKind.Sequential)] public struct contact_info { [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] public String cell; [MarshalAs(UnmanagedType.ByValTStr, SizeConst=32)] public String home; } [StructLayout(LayoutKind.Sequential)] […]

如何从C#调用ac函数

我想在C#中使用这个C函数: typedef void (*WRITE_CALLBACK)(int hMountEnv, unsigned __int64 NumBytesWritten, void* pContext); 我该如何定义它以便我可以调用它? 我需要做任何其他事情才能使这项工作成功吗?

通过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的错误代码,所以要么它没有调用我的函数,要么因为我的代码错误而无法正常工作。

C源代码为Dll

我需要你的帮助,让我在这里解释一下情况:我有用VC ++ 6.0编写的交流源代码,我需要在我编码的C#应用​​程序中使用该代码,我做了很多事情才能实现,我已经在发布模式下运行该C源文件并生成了intermediate.manifest文件和其他文件,我可以使用这些文件中的任何一个来解决我的问题。 否则请指导我应该尽快做什么? 拉胡尔夏尔马

在.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 […]

优化:switch语句中的case的顺序是否重要?

考虑使用您选择的语言的switch语句(例如,Java,C,C#…)。 当然,如果存在突破,则case语句的顺序很重要,但假设每个case都有break ,因此顺序没有语义重要性。 例如,在考虑优化时, case陈述的顺序是否重要? 是按升序对案件进行排序还是在订购中没有任何好处? 编译器可能执行哪些优化可能取决于case的顺序。 由于任何编译器可能会也可能不会选择这样的优化,我不想在这里要求特定的语言或编译器。 问题是关于可能发生的事情。

从C#调用C DLL方法的正确方法

我试图从第三方DLL执行一些方法(在这种特殊情况下,rdOnAllDone),用C语言编写,然后查看头文件,我发现: #ifndef TDECLSDONE #ifdef STDCALL #define CCON __stdcall #else #define CCON __cdecl #endif #define TDECLSDONE #endif #define DLLIMP __declspec (dllimport) DLLIMP int CCON rdOnAllDone (void(CCON *)(int)); 在调用一种方法来调用这个方法后,我做了这个: [DllImport(“sb6lib.dll”, CallingConvention = CallingConvention.Cdecl)] public static extern int rdOnAllDone(Delegate d); public delegate void rdOnAllDoneCallbackDelegate(); private static void rdOnAllDoneCallback() { Console.WriteLine(“rdOnAllDoneCallback invoked”); } 除了我无法获取int参数之外,该方法被正确调用。 所以我尝试像这样添加输入参数int [DllImport(“sb6lib.dll”, CallingConvention = CallingConvention.Cdecl)] […]