我目前正在尝试从非托管C++应用的C#DLL调用函数。在网上搜索了几个小时之后,我发现我有几个选择。我可以使用COM、DllExport,或对委托(delegate)使用反向PInvoke。最后一个听起来对我最有吸引力,所以在搜索SO之后我结束了here.它指出文章展示了如何使用反向PInvoke,但看起来C#代码必须先导入C++Dll,然后才能使用。我需要能够使用C++调用我的C#Dll函数,而无需先运行C#应用程序。也许反向PInvoke不是做到这一点的方法,但我在处理低级内容时非常缺乏经验,因此任何有关如何执行此操作的指示或提示都会很棒。链接中的代码是C#usingSystem.
我已经编写了一个CDLL和一些C#代码来测试包含这个DLL并从中执行函数。我不太熟悉这个过程,每当从C#源代码调用我的DLL函数时,我都会收到PInvokeStackImbalance异常。代码如下(我已经注释掉了大部分代码以隔离这个问题):C#包含代码:usingSystem;usingSystem.Runtime.InteropServices;usingSystem.IO;namespaceTestConsoleGrids{classProgram{[DllImport("LibNonthreaded.dll",EntryPoint="process")]publicunsafe
我想确定系统颜色(例如SystemColors.HotTrack)的RGB颜色。有没有一种方法可以在不使用P/Invoke和GetSysColor(不包括绘制位图和检查像素值)的情况下做到这一点? 最佳答案 byter=SystemColors.HotTrack.R;byteg=SystemColors.HotTrack.G;byteb=SystemColors.HotTrack.B;或intargb=SystemColors.HotTrack.ToArgb(); 关于c#-我可以在不使
我想通过c#/PInvoke调用GetLogicalProcessorInformation功能,但我坚持SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构和CACHE_DESCRIPTOR结构。我应该如何定义这些结构以便正确使用?主要问题:1.SYSTEM_LOGICAL_PROCESSOR_INFORMATION在其定义中有联合2.SYSTEM_LOGICAL_PROCESSOR_INFORMATION有ULONGLONG在它的定义中3.CACHE_DESCRIPTOR的定义中有WORD和DWORD。你能帮我解决这些结构吗? 最
在thisquestion我已经搜索了一个简单的解决方案来取消阻止文件。感谢所有评论和回答,我通过PInvokingDeleteFile找到了一个简单的解决方案。它有效,但是因为我从来没有通过PInvoke(Win32)使用过文件操作,所以我不知道是否存在一些陷阱或者是否有另一种调用DeleteFile来删除的方法文件的备用流。我还不知道的是,我是否必须将调用包装在try/catch中,或者仅查看bool结果是否足够。在我的测试中,没有出现异常,但我不知道现实世界中会发生什么。publicclassFileUnblocker{[DllImport("kernel32",CharSet=
我正在编写一个C#应用程序,它使用互操作服务访问nativeC++DLL中的函数。我已经在使用大约10个不同的功能。现在我不确定如何处理将回调作为参数传递,以便DLL可以调用我的代码。DLL的函数原型(prototype)如下:typedefvoid(WINAPI*lpfnFunc)(constchar*arg1,constchar*arg2)以及允许我传递上述类型的函数:intWINAPISetFunc(lpfnFuncf)这是我的委托(delegate)和函数定义的C#代码:publicdelegatevoidFunc(stringarg1,stringarg2);publicst
假设您正在调用一个将填充您的字节数组的Win32函数。您创建一个大小为32的空数组。然后将其传递给Win32函数以填充int,稍后在您的托管代码中使用它。在分配字节数组和由Win32函数填充字节数组之间,是否存在可能移动或覆盖字节数组的可能性? 最佳答案 简短回答:不,在这种情况下不需要固定更长的答案:当托管对象跨越PInvoke边界时,CLR将自动固定对托管对象的引用。一旦PInvoke函数退出,引用将被取消固定。因此,在使用native函数填充byte[]等情况下,无需手动固定,因为该对象仅在函数调用期间由native代码使用。
我正在努力组合一个pinvoke'ingCreateJobObject和SetInformationJobObject的工作示例。通过各种谷歌搜索(包括俄语和中文帖子!),我拼凑了以下代码。我认为JOBOBJECT_BASIC_LIMIT_INFORMATION的定义会根据平台(32/64位)发生变化。CreateJobObject/AssignProcessToJobObject似乎有效。SetInformationJobObject失败-错误24或87。ProcessmyProcess//POPULATEDSOMEWHEREELSE//CreateJob&assignthispro
我正在尝试编写一些从非托管DLL调用方法的C#代码。dll中函数的原型(prototype)是:extern"C"__declspec(dllexport)char*foo(void);在C#中,我首先使用:[DllImport(_dllLocation)]publicstaticexternstringfoo();它表面上似乎工作正常,但我在运行时遇到内存损坏错误。我想我指的是恰好正确但已被释放的内存。我尝试使用名为“P/InvokeInteropAssistant”的PInvoke代码生成实用程序。它给了我输出:[System.Runtime.InteropServices.DLL
Windows上可用的.NETFramework中的平台调用。[DllImport("user32.dll",CharSet=CharSet.Auto)]publicstaticexternMessageBoxResultMessageBox(IntPtrhWnd,Stringtext,Stringcaption,intoptions);PInvoke在Linux和MacOSX平台上可用吗?例如Mono项目?如果Linux和MacOSX支持PInvoke,您能否在回答中给我一些示例或引用。谢谢。 最佳答案 与原生库互操作http:/