草庐IT

c# - p/从在 x64 机器上运行的 C# 程序调用 32 位 dll

我有一个C#程序,我在x64计算机上使用所有默认设置进行编译。我想p/调用一个我知道是32位(非托管)C++DLL的DLL。当我的C#程序在32位计算机而非64位计算机上运行时,我可以让它工作。如何在调用32位dll的DllImport调用中指定?我现在拥有的示例:[DllImport("test32bitdll.dll",SetLastError=true)]publicstaticexternvoidMyFunc();我没有test32bitdll.dll文件的源代码。 最佳答案 在64位进程中运行32位非托管代码是不可能的。或

c# - P/Invoke 返回带有字符串字段的结构数组

我使用p/invoke从我的非托管代码返回一个“DN_OPstruct”数组:structDN_OPstruct{constchar*TargetNode_Identifier;constchar*Name;intTargetNode_NamespaceIndex;...};EXTERN_CUA_EXPORT_WRAPPER_IMPORTintgetOpToArr(constchar*_rootGuid,DN_OPstruct**array,int*arraySizeInElements){std::listuaList;uaList=getLisT(...)*arraySizeInE

c# - C# 中的 C++ union — 奇怪的行为

我正在尝试使用C#中的VHDAPI创建一些vhd/vhdx文件。有一个看起来像这样的C++union:typedefstruct_CREATE_VIRTUAL_DISK_PARAMETERS{CREATE_VIRTUAL_DISK_VERSIONVersion;union{struct{GUIDUniqueId;ULONGLONGMaximumSize;ULONGBlockSizeInBytes;ULONGSectorSizeInBytes;PCWSTRParentPath;PCWSTRSourcePath;}Version1;struct{GUIDUniqueId;ULONGLONG

c# - 从 C# 使用 DirectX DLL (C++)

我有一个使用DirectX的nativeC++DLL,我希望能够通过C#使用它来创建内容创建工具。添加COM似乎需要相当大的努力。P/Invoke是否可以用于维护使用多态性的类,还是需要我包装大部分代码以方便使用P/Invoke?有更好的解决方案吗?或者我是否应该考虑使用Qt用C++编写工具? 最佳答案 在进行C#到C++互操作时,我始终觉得C++/CLI始终是最佳选择。您可以轻松地为非托管库创建精简包装器,它看起来与您的C#代码的托管库完全一样。它还可以让您更好地控制编码和固定的执行方式。我相信有一些方法可以自动生成C++/CLI

c# - 如何在C#中使用C++ DLL导出的接口(interface)指针

我有一个用C++编写的DLL,它导出一个函数CreateRisk。该函数返回一个接口(interface)指针,如下所示:extern"C"{__declspec(dllexport)IRisk*__stdcallCreateRisk(){returnnewRisk();}}IRisk派生自IUnknown并具有自定义方法Calculate:classIRisk:publicIUnknown{public:virtualint__stdcallCalculate(inti,doubles)=0;};类Risk实现IRisk接口(interface)(这里省略实现)。我想要的是在C#中调

c# - 如何制作 PInvoke 友好的 native API?

如何使原生API对PInvoke友好?有一些关于如何修改native程序以与P/Invoke一起使用的提示here.但是在我编写native程序之前,我应该注意哪些事项才能使我的程序/库PInvoke友好?使用C或C++都可以。更新:如果我编写CAPI,我必须做些什么才能使用如下C#语法进行P/Invoke:[DLLimport("MyDLL.dll")]是否可以对原生C++代码/库执行相同的操作?制作P/Invoke友好nativeAPI的一些技巧的总结/改写:+参数应该是本地类型(int、char*、float、...)+参数越少越好+如果动态内存被分配并传递给托管代码,请确保创建

c# - 如何从 C# 调用具有 void* 回调和对象参数的 C++ Dll 中的函数

我正在尝试创建一个Cdll的包装器,我正在尝试调用一个函数,该函数采用回调函数,接收一个对象作为传回的指针。.h文件删除externintSetErrorHandler(void(*handler)(int,constchar*,void*),void*data_ptr);处理程序是一个回调函数,在发生错误时调用,data_ptr是传回给您的任何对象(状态),在我的应用程序中就是这个(当前对象)。我能够在使用编码常量类型(如简单类型字符串、整数等)的dll中调用函数。但我不知道如何编码指向作为状态的C#对象的指针。为了将我通过在此处搜索找到的对象引用传递给C函数,否则我似乎需要一个结构

c# - 从 C# 访问 C++ DLL 库

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:pinvokestackimbalance—howcanIfixthisorturnitoff?我需要从c#代码访问一个c++dll库(我没有源代码)。例如以下函数:UINT32myfunc1()UINT32myfunc2(INchar*var1)UINT32myfunc3(INchar*var1,OUTUINT32*var2)对于myfunc1我使用下面的代码没有问题:[DllImport("mydll.dll")]publicstaticexternintmyfunc1();另一方面,我无法使用myfunc

c# - c++从hbitmap获取原始像素数据

我对使用p/invoke调用还很陌生,想知道是否有人可以指导我如何从hbitmap中检索原始像素数据(unsignedchar*)。这是我的场景:我正在C#端加载一个.NETBitmap对象,并将它的IntPtr发送到我的非托管C++方法。在C++端收到hbitmapptr后,我想访问位图的像素数据。我已经制作了一个接受unsignedchar*的方法,它表示来自c#的原始像素数据,但是我发现从c#中提取byte[]相当慢。这就是为什么我想发送Bitmapptr而不是将Bitmap转换为byte[]并将其发送到我的C++方法。获取BitmapIntPtr的C#代码BitmapsrcBi

c# - 从 C++ DLL 在 C# 中触发事件

我有一个与Cisco服务器(UCCX)通信的非托管C++DLL。它通过TCP/IP向服务器发送消息和从服务器接收消息。现在它接收到一些类型的消息,其中包含一些需要发送到C#GUI的参数,该GUI将在屏幕上显示这些参数。请告诉我从这个DLL触发C#事件的有效方法。 最佳答案 http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx似乎回答了你的问题。您在C#端使用委托(delegate),在C++端使用标准回调。C++方面:typedefvoid(__std