Tag: c#

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; […]

创建本机C ++ OpenGL 3D编辑器并将其用作C#中的WinForms或WPF控件

我想创建一个简单的3D编辑器程序,我不喜欢C ++ windows编程。 但是,我也不想在使用OpenGL时弄乱托管代码。 因此,可以在本机C ++中创建一个控件,它将托管OpenGL 3D绘图表面,没有其他控件,也有接口(方法和属性),并将其用作WinForms中的控件,甚至更好,WPF申请?

用于跨平台应用的CRC

我希望在VB.NET或C#应用程序以及C / Linux应用程序中使用通用CRC逻辑。 我有一个与Web服务(用C#编写)和Web应用程序(用VB.NET编写)交互的C / Linux应用程序。 对于某些数据,我想从.NET端向数据本身(比如文件)添加CRC,并检查客户端上数据的完整性(检查CRC),反之亦然。 有人可以指导我吗?

float *从C到C#

我不是一个真正的CS人,所以如果你们这里的天才能指出我正确的方向,我将永远感激。 我有一个c-code命令行函数,用于将其结果写入文件。 我将其转换为通过float *数组将其数据返回到类似的C ++程序(以避免常量文件I / O): float * mgrib(int argc, char **argv) 这非常有效。 我现在需要把它变成一个C#程序,这就是事情变得混乱的地方。 我做的第一件事就是避免使用char **来使争论成为一系列bool。 如果我允许它仍然转储到文件,这工作正常。 问题是在C#中使用c风格的float数组。 在c-code中,它被分配了malloc。 所以这是我尝试过的一切都没有成功(我知道数组的大小): 制作一个“免费”函数,以便在完成后从C#调用以释放内存。 经过几次循环后,C#崩溃,没有任何警告。 使用Marshal.FreeCoTaskMem从C#释放malloc。 结果相同。 将float *移动到参数并删除c代码malloc。 (void mgrib(…,float * data,…) __a)使用Marshal.AllocCoTaskMem分配它。 使用Marshal.FreeCoTaskMem释放它。 __b)使用Marshal.Copy进行分配。 使用Marshal.FreeCoTaskMem释放它(也许这是错的?) 我已经涉足了我能在网上找到的所有东西。 如果需要更多信息,请告诉我。 我希望这只是一个我想念的简单概念。

如何使用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 = […]

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

将复杂数据类型从纯c插件传递到Unity C#脚本

我目前正在为Objective-C中的Unity编写一个In-App购买插件,使用纯C作为Unity和objective-c代码之间的API。 介绍我面临的问题 基本function已经有效。 也就是说,我已经在我的插件中有一个非常基本的函数调用来启动对Apple App Store的产品请求,可以从Unity调用。 在Unity脚本中,您只需将此方法称为: [DllImport (“__Internal”)] private static extern void RequestProducts(string[] productIdentifiers, int arrayCount); public static void RequestProductData( string[] productIdentifiers ) { RequestProducts(productIdentifiers, productIdentifiers.Length); } 这会调用C函数,如下所示: void RequestProducts(char* productIdentifiers[], int arrayCount) { // Call the In-App purchase manager to initialize the product request [[InAppPurchaseManager sharedInAppPurchaseManager] RequestProductData:productIdentifierCollection]; } 现在我省略了C函数的一部分,它接受了productIdentifiers数组并将其转换为NSArray,只是为了保持简单并解释我试图解决的问题。 现在InAppPurchaseManager类是一个单例类。 RequestProductData方法向app store发起产品请求。 问题 […]

通过互操作接收字符串

我无法从我写的一些c代码中获取字符串。 首先是一些通常未分离的背景信息:我想从TAPI API接收TAPI TSP的用户可读字符串。 我已经实现了一个半可行的TAPI解决方案,依赖于匹配的驱动程序名称到存储的字符串,但是想要改变它以使用permanant line id,因为我们的一个客户有一个(阿尔卡特)PBX拒绝以任何其他方式工作。 在C中,我将头文件中的函数定义为: __declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName); 这样写的function如下: __declspec(dllexport) void GetDeviceName(long DeviceId, wchar_t* DeviceName) { //tapi code here… //copy the string to DeviceName wcscpy(DeviceName, (wchar_t*)((char *)devCaps + devCaps->dwLineNameOffset)); } 如上所述,这最终会做一些有用的事情,但是现在我很高兴如果abc放在我的wchar_t * / StringBuilder中,我可以在C#中看到它。 在C#中我将函数定义为: [DllImport(“SBW.Tapi.TapiInterop.dll”, CharSet = CharSet.Auto)] static extern void GetDeviceName(long DeviceId, StringBuilder DeviceName); 我将DeviceName定义为StringBuilder,因为字符串是不可移植的,我希望DeviceName在C中设置( 这是MS推荐的 )。 […]

获取屏幕当前颜色filter的颜色

以下代码将屏幕的滤色器设置为特定颜色。 我怎样才能获得屏幕的颜色? [DllImport(“GDI32.dll”)] private unsafe static extern bool SetDeviceGammaRamp(IntPtr hdc, void* ramp); private static IntPtr hdc; public unsafe bool SetLCDbrightness(Color c) { short red = cR; short green = cG; short blue = cB; Graphics gg = Graphics.FromHwnd(IntPtr.Zero); hdc = gg.GetHdc(); short* gArray = stackalloc short[3 * 256]; short* idx = gArray; short brightness = […]