jjzjj

c# - 使用 COM 互操作将 BSTR 从 C++ 编码到 C#

我有一个用C++编写的进程外COM服务器,它由一些C#客户端代码调用。服务器接口(interface)之一上的方法向客户端返回一个大的BSTR,我怀疑这是导致内存泄漏的原因。代码有效,但我正在寻求有关编码BSTR的帮助。稍微简化一下,服务器方法的IDL是HRESULTProcessRequest([in]BSTRrequest,[out]BSTR*pResponse);实现看起来是这样的:HRESULTMyClass::ProcessRequest(BSTRrequest,BSTR*pResponse){USES_CONVERSION;char*pszRequest=OLE2A(req

c# - 如何将带有 const char* 的 C union 映射到 C# 结构?

在本地库的回调函数中,我需要访问一个espeak_EVENT数组。问题出在原C代码中的UNION语句:typedefstruct{espeak_EVENT_TYPEtype;unsignedintunique_identifier;//messageidentifier(or0forkeyorcharacter)inttext_position;//thenumberofcharactersfromthestartofthetextintlength;//wordlength,incharacters(forespeakEVENT_WORD)intaudio_position;//th

c# - 将数组从 C++ 移动到 C#、修改它并将其传递回 C++ 的最简单方法

我有一个C#类库,其中包含需要与外部应用程序一起使用的方法。不幸的是,此外部应用程序仅支持C/C++中的外部API。现在,我已经设法获得了一个在C++dll和C#DLL之间工作的非常简单的COM示例,但我对如何移动数组数据一筹莫展。这就是我到目前为止所得到的,就像我在网络上找到的一个通过COM进行通信的小例子:DLL_EXPORT(void)runAddTest(intadd1,long*result){//InitializeCOM.HRESULThr=CoInitialize(NULL);//Createtheinterfacepointer.IUnitModelPtrpIUnit

c++ - 如何从智能感知中正确隐藏方法和属性

有谁知道如何在保留调用它们的能力的同时从智能感知中正确地隐藏类、方法和属性?因此它们不会出现在从类型库生成的互操作程序集中?我正在为我们不希望向消费者公开的自动化测试编写APIHook。这似乎在我们的应用程序附带的内置SaxBasic编辑器中运行良好,但在将引用添加到我们的互操作程序集时无法隐藏对象、方法和属性。这是我试图隐藏这些的一个例子;已经尝试了各种排列,提前致谢![object,uuid(guid),helpstring("help"),version(ver),dual,nonextensible,oleautomation,pointer_default(unique)]I

c# - C++/CLI 使用抽象方法从 native C++ 类继承并将其公开给 C#

我一直在谷歌上四处搜索,试图找到一个完整的例子,但无济于事。我有一个C++API,它提供了许多类,这些类包含供开发人员扩展的纯虚拟方法。我试图做的是通过C++/CLI向C#提供此接口(interface)。我已经设法将API编译到C++/CLI库中,但由于我是新手,所以遇到了困难。我知道我需要创建一个包装器来将C++/CLI非托管类暴露给托管.net类,但我还没有找到一个可靠的示例或讨论来说明如何使用抽象的C++执行此操作类(class)。任何人都可以为我指出正确的方向吗?一个完整的示例包括C#测试应用程序,它显示了如何为抽象类创建包装器的端到端。它似乎是一个“哦,你只是做X”的事情,

c# - 从 .NET 程序集透明地访问 native 内存

我正在评估为native应用程序实现插件基础结构的可能性,该基础结构允许在托管代码中编写扩展。这些插件将对分配在native堆上的大型(-ish)浮点缓冲区进行操作,这些缓冲区在复制内存占用方面相当昂贵。因此,插件应该能够直接在native内存上操作。据我所知,可以使用UnsafeCodeandPointers从托管代码访问native内存(据我了解,这是.NET框架中唯一这样做的条款)。为了简化插件的开发,我宁愿不公开这个工件,而是提供一个代理机制,以便可以像托管集合一样访问缓冲区。对于实现(例如,C++/CLI互操作层很好)或特定的.NET运行时版本没有限制。缓冲区也可以假定为固定

c# - 从 C++ 调用 C# 方法而不使用 COM

有没有办法在不使用COMIterop的情况下从非托管C++创建C#对象和调用方法?我正在寻找类似JNI(但适用于.Net)的东西,您可以在其中手动创建VM、创建对象等。 最佳答案 如果您使用的是C++/CLI,那么您可以直接与托管世界和非托管代码进行交互,因此互操作很简单。您也可以自己托管CLR,虽然托管API是基于COM的,但您随后可以创建任何托管对象。这个过程并不困难,因为听起来几个API调用封装了很多功能。网上有很多信息,例如关于“HostingtheCommonLanguageRuntime”的MSDN文档。

c# - 将 C++ 类编码(marshal)到 C#

我需要在某些C#代码中访问nativeC++DLL中的代码,但在确定编码(marshal)处理时遇到问题。我以前用纯C的代码做过这个,但似乎发现它不能直接用C++类实现。由于许多类包含虚函数或内联函数,这使情况变得更加复杂。我什至尝试通过PInvokeInteropAssistant传递标题,但它会阻塞几乎所有东西,而不是真的没有什么可做的……我猜是因为它没有得到真正的支持。那么,如果可能的话,如何使用.NET代码中的nativeC++类DLL。如果我必须使用一些中介(CLRC++?)那很好。 最佳答案 在C#中确实没有简单的方法可

c# - 从 C# : should I pass StringBuilder or use unsafe code? 调用非托管函数

我有一个C#程序需要将char缓冲区传递给非托管函数。我发现了两种似乎工作可靠的方法,但我不确定应该选择哪一种。这是非托管函数的签名。extern"C"__declspec(dllexport)intgetNextResponse(char*buffer);第一个选项是将缓冲区定义为StringBuilder,如下所示。//atclasslevel...[DllImport("mydll.dll")]staticexternintgetNextResponse(StringBuilderbuffer);//inmainmethodbody...StringBuildersb=newSt

c# - PCWSTR 与 LPWSTR

根据我的理解(如果我错了请纠正我),它们之间的唯一区别是字符串是否可以被调用的函数修改。(PCWSTR,LPWSTR)我现在正尝试将字符串从C#传递到需要PCWSTR的函数,但我能找到的只有[MarshalAs(UnmanagedType.LPWStr)]。我说得对吗?(是的,它有效。不过,这并不能证明它没问题。有些事情有效但随后会导致内存泄漏等) 最佳答案 PCWSTR是一种时代错误的恐龙与人类电影风格。查找在Unicode字符串上使用短指针的16位程序就像查找白象一样。只有LPCWSTR和LPWSTR之间的区别才有意义。LPCW