Tag: pinvoke

如何编组c#中的集合以传递给本机(C ++)代码

我正在进行企业应用程序开发。 整个应用程序是用c ++开发的,除了用c#开发的用户界面,现在是用c ++代码连接用户界面的时候了。 经过详细研究,我选择PInvoke才能这样做。 一切都很成功,我遇到的唯一情况就是如何将集合传递给C ++代码。 例如: C#侧码 List lst = new List(); lst.Add(“1”); lst.Add(“2”); lst.Add(“3”); lst.Add(“4”); C ++边码 std::vector vStr; 现在我如何将lst传递给本机C ++代码

C#中的C ++ Struct

我使用DllImport在我的C#项目中使用C ++编写的DLL,我使用的其中一个函数如下所示: [DllImport(“dds.dll”, CharSet = CharSet.Auto)] private static extern int Par( ddTableResults2 tableResult, ref parResults ParResult, int vul ); parResults结构在C ++中定义如下: struct parResults { /* index = 0 is NS view and index = 1 is EW view. By ‘view’ is here meant which side that starts the bidding. */ char parScore[2][16]; char parContractsString[2][128]; }; […]

反转PInvoke并创建一个完整的非托管C#程序

我知道这是一个奇怪的问题但是这个想法很简单:我更喜欢C#语法而不是C ++:-Setters和getter直接在属性-interfaces -foreach语句中 – 可谓声明隐式转换运算符 其他小东西…… 我真的不知道的是,如果我不使用任何命名空间(甚至是系统),是否可以在C#中导入c ++ dll(特别是std库) 这个想法只是使用你通常在C ++中使用的所有东西编写一个程序(CLR都没有),甚至是printf例如 谢谢你的回答

使用约束执行区域

我有一个Visual Studio 2008 C#.NET 3.5应用程序P / Invokes一个接受文件句柄作为参数的本机方法。 最初,我只是使用FileStream.SafeFileHandle.DangerousGetHandle()来获取文件句柄。 但是,在启用FX COP之后,我收到了CA2001的警告。 因此,经过一番研究后,我发现了“约束执行区域”。 这对我来说是新的,我还没有看到很多关于它的信息。 我希望有经验的人可以看看并validation我是否已正确完成此操作。 class MyClass { public static bool Write(string filename) { using (var fs = new System.IO.FileStream(filename, System.IO.FileMode.Create, System.IO.FileAccess.Write, System.IO.FileShare.None)) { bool got_handle; bool result; System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions(); try { } finally { fs.SafeFileHandle.DangerousAddRef(ref got_handle); result = NativeMethods.Foo(fs.SafeFileHandle.DangerousGetHandle()); if (got_handle) fs.SafeFileHandle.DangerousRelease(); } return result; } } […]

之前没有访问的访问冲突

我是P /调用Graphviz ,如下所示 。 当我写这篇博客文章时,代码工作正常。 现在,我正在整理一个使用该代码渲染Graphviz图形的HttpModule ,但是我在agmemread得到了一个AccessViolationException 。 // Native signature Agraph_t agmemread(char *); // P/Invoke Signature [DllImport(LIB_GRAPH)] private static extern IntPtr agmemread(string data); // Usage IntPtr g = agmemread(data); 就像我说的,这之前完美无缺。 但现在,我无法让我的代码适用于任何事情。 甚至我基于相同代码的旧Graphviz应用程序也不再适用。 我可能有什么改变会导致这种情况? 我甚至没有下载新版本的Graphviz或任何东西,所以DLL都是一样的。 编辑:我尝试将string更改为StringBuilder ,但这产生了相同的结果。 然后,我添加了一个MarshalAs属性: static extern IntPtr agmemread([MarshalAs(UnmanagedType.LPWStr)] string data); 有了它,我不再获得AccessViolationException ,但Graphviz无法正确读取字符串并返回空指针。

“P / Invoke入口点应该存在”,应该指出正确的入口点

我从Visual Studio 2012中的代码分析工具收到此警告。代码如下所示: using System; using System.Runtime.InteropServices; namespace MyProgramNamespace { class NativeMethods { [DllImport(“user32.dll”, EntryPoint = “GetWindowLongPtr”)] public static extern IntPtr GetWindowLongPtr(IntPtr handle, int flag); [DllImport(“user32.dll”, EntryPoint = “SetWindowLongPtr”)] public static extern IntPtr SetWindowLongPtr(IntPtr handle, int flag, IntPtr ownerHandle); } } 我正在编译x64,所以我不关心使用旧的GetWindowLong和SetWindowLong。 据我所知,这些入口点名称是正确的。 编辑:已解决。 原来问题是Visual Studio本身(因此代码分析工具)是32位。 当代码分析工具检查user32.dll以查看是否存在这些函数时,它会检查32位版本的user32.dll(在C:/ Windows / SysWOW64 /中)而不是程序实际使用的版本(64位版本)在C:/ Windows / System32中,这些函数只存在于64位版本中(32位版本使用GetWindowLong / […]

将动态大小数组编组到struct中

如何定义具有动态大小数组的结构? 这样对吗? struct MyStruc { public int len; [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=0)] public int buf[]; }

通过SetEnvironmentVariable进行的更改不会在使用getenv的库中生效

我有一个简单的c#应用程序,它使用mingnu编译器工具集绑定到库编译。 我可以轻松地调用库中的函数而不会出现问题。 然而,库调用getenv来设置自己这个环境变量需要设置为库正常工作所以我使用Environment.SetEnvironmentVariable但是库无法检索我设置的值。

对于64位应用程序,.NET使用WSAStartup是安全的吗?

对于64位应用程序,.NET Framework版本与WSAData结构的本机Win32版本之间存在不匹配,因为字段的顺序不同。 我复制了.NET版本,用于我们基于C#的产品,同事担心我的内存损坏。 使用DllImport / PInvoke时,由于这种不匹配,是否存在内存损坏的风险? 将本机版本封送到托管版本时是否存在无效内存访问风险? 我们假设我并不关心实际访问生成的WSAData对象的字段。 我只是想确定我对WSAStartup的调用不会破坏内存或使应用程序崩溃。 这是WinSock2.h中的本机C ++版本。 请注意,成员的顺序在64位与32位之间是不同的。 WSADESCRIPTION_LEN为256,WSASYS_STATUS_LEN为128。 typedef struct WSAData { WORD wVersion; WORD wHighVersion; #ifdef _WIN64 unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; #else char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; #endif } WSADATA, […]

P /调用函数传递StringBuilder

在C#文件中我有一个 class Archiver { [DllImport(“Archiver.dll”)] public static extern void archive(string data, StringBuilder response); } 字符串数据是一个输入,StringBuilder响应是函数写入的东西 归档函数原型(用C编写)如下所示: void archive(char * dataChr, char * outChr); 它在dataChr中接收一个字符串,然后执行a strcpy(outChr,”some big text”); 从C#我称之为: string message = “some text here”; StringBuilder response = new StringBuilder(10000); Archiver.archive(message,response); 这是有效的,但问题是,你可能会看到我给StringBuilder大小一个值,但是归档函数可能会返回一个(方式)更大的文本,而不是我给我的StringBuilder的大小。 有任何解决这个问题的方法吗?