问题标签 [unmanaged]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1327 浏览

.net - 如何将 double* 转换为数组(6)

我有一个返回 6 个双精度数组的函数。

我想将此返回值转换为托管代码。

我收到此错误:

我该怎么做?

谢谢。

0 投票
1 回答
808 浏览

.net - Windows 窗体控件库;托管和非托管

我编写的 Windows 窗体控件库项目 (C++) 使用非托管 dll。非托管 dll 有一个头文件(柴郡猫)。我只是将它包含在控制库项目中。并调用非托管 dll 中的函数(当然需要适当的编组)。这将编译和构建。问题是当我继续将控件添加到我的脚手架的工具箱中时,这是一个托管 C++ winform 应用程序,VS2005 抱怨它不是一个 .Net 模块。

我见过人们使用 MFC dll 作为 Windows 窗体控件进行转换。我究竟做错了什么?。

0 投票
5 回答
7555 浏览

c# - 将非托管 c++ 类库暴露给 c#

我实际上有两个未损坏的 c++ 库,其中一个使用了另一个。两者都很大,所以重写不是我的选择。

我读了一些关于创建一个包含非托管代码的托管 c++ 库的内容。但我真的不知道如何开始,以及如何将所有这些东西结合到一个项目中......

是否有任何分步指南或易于理解的示例来说明如何执行此操作?

TIA

0 投票
6 回答
2797 浏览

c# - 调用非托管函数 char 返回 char *

我在非托管 C/C++ 代码 (dll) 中有一个函数,它返回一个包含 char 数组的结构。我创建了 C# 结构来在调用函数时接收这个返回值。在调用这个函数时,我得到'System.Runtime.InteropServices.MarshalDirectiveException'

这是 C 声明:

这是 C# 声明:

我正在使用 1 字节的 ASCII。

有没有人有关于如何做到这一点的提示或解决方案?

0 投票
2 回答
1955 浏览

c++ - 将 Windows 句柄传递给非托管 C++ dll

非托管 C++ dll 有一个导出函数,它采用 int 类型作为窗口句柄

否则,在非托管 dll 代码中,它int被强制转换为HWND并正确使用。

从 windows 窗体应用程序中,我将句柄设置如下

_hHandle类中的私有成员在哪里。我的手柄正确吗?似乎是这样,但显然应用程序没有给出期望的输出。我怀疑问题出在手柄上。

PS:我可以访问非托管 dll,因此我可以在其中进行修改以进行任何建议的更改。

0 投票
4 回答
3126 浏览

c# - 将 C dll 代码编组为 C#

我在 dll 中有以下 C 代码签名:

C 函数可以修改 w、h、enc、lp、mp 和 ep(尽管后三个可以为 null,它不会做任何事情。

我在 C# 中使用以下内容

我收到了 SystemAccessViolation,但我不完全确定我的问题是什么时候出现的。

0 投票
2 回答
855 浏览

.net - AccessViolationException 调用我能从托管代码中想到的最基本的 c++ 函数

我正在尝试学习如何使用托管/非托管代码互操作,但我遇到了 4 小时谷歌搜索无法克服的问题。我在 Visual Studio 中放置了 2 个项目,一个创建了一个 win32 exe,一个创建了一个 windows forms .NET 应用程序。经过一堆乱七八糟的处理后,我得到了正确调用 c++ 代码的 C# 代码,但是从这里我开始每次进入那里时都会收到 AccessViolationException。以下是 .cpp 文件中的代码:

这是来自 C# windows 窗体应用程序的代码调用它:

很简单吧?该调用有效,并且我能够进入 c++ 代码(我为该项目打开了非托管调试),但它每次都因 AccessViolationException 而死在数组创建行上。当我运行可执行文件时,相同的代码运行良好(c++ 代码在控制台应用程序项目中,我尝试从 _tmain 函数调用它,没有问题),但是当从 .NET 调用它时,它每次都会爆炸。

必须有一些明显的东西我在这里遗漏了,但是我没有从阅读教程中找到任何有用的东西,而且关于该异常的大多数问题都是人们遇到复杂的编组或 GCHandles 的问题。提前感谢您的帮助。

更新:你就在下面,但这很奇怪。起初,当我开始这个时,我认为我无法做到这一点(调用可执行文件中的函数),但是当我尝试它时——它确实有效,调用就是这样。似乎它允许您将函数调用到可执行文件中,但是一旦您尝试分配任何内存,它就会死掉。无论如何,感谢您的建议,它现在似乎工作正常。

0 投票
8 回答
2661 浏览

c++ - 如果 ANSI C++ 不支持多线程,非托管 C++ 应用程序如何实现多线程?

我听说 C++ 不提供对多线程的本机支持。我假设多线程 C++ 应用程序依赖于多线程的托管代码;也就是说,例如,一个 Visual C++ 应用程序使用 MFC 或 .NET 或类似的东西来提供多线程功能。我进一步假设这些托管代码功能中的一些或全部对于非托管应用程序是不可用的。但是我已经阅读了有关非托管多线程应用程序的信息。这怎么可能?我的哪个假设是错误的?

0 投票
3 回答
5259 浏览

interop - GetPhysicalMonitorsFromHMONITOR 返回的句柄始终为空

在 Media Foundation SDK 上,有一个GetPhysicalMonitorsFromHMONITOR函数,我正在尝试使用 C# 实现该函数,但没有运气......

在返回的 PHYSICAL_MONITOR[] 中,该函数返回监视器的字符串描述,但由于一些神秘的原因,hPhysicalMonitor句柄仍为 0。

我已经使用 P/Invoke Interop Assistant 生成了签名,并稍作修改。

PHYSICAL_MONITOR 结构或其他任何东西是否需要进一步调整?

谢谢你。

0 投票
2 回答
2243 浏览

com - HOWTO:在 WindowsCE Compact Framework 上从非托管 C++ 调用托管 C# 接口

我有大量非托管 Windows CE 5 C++ 代码,通过将它与在 Windows CE 6 和 Compact Framework 上用托管 C# 编写的大量更新的业务和通信逻辑相结合,提供了一个我想在新产品中使用的 UI。

UI 可能知道业务逻辑,但我希望业务逻辑不了解 UI,以便我以后可以用托管版本或我选择作为前端的任何其他 UI 替换它。

我找到了一篇文章,描述了如何在 Windows 世界中使用 COM 作为桥梁,但在 WinCE 下的 .NET CF 中应用它时遇到了困难。过去我导入类型库,使用COM调用(CoInitialize()、CoCreateInstance())来获取其他Windows平台上的接口指针,这就是我现在追求的策略:直接在非托管 C++ 库来访问我的托管库中的 C# 接口,假设 WinCE 中提供了相同的工具。

这是我的问题:类型库。它在我的托管 C# 库中不可用,因为我过去通过 '#import "SomeCPPLibrary.dll"' 语句使用它。我相信它隐藏在 .dll 程序集中,以与过去不同的方式存储,因此不能通过库本身的#import 直接使用。我认为我可以#import 一个 typelib,但是我找不到从我的托管 .dll 中提取 typelib 的方法,虽然我可以将一个接口定义文件 (.idl) 组合在一起并使用平台的 midl.exe要从中生成 .tlb,不能保证我的 .idl 以及由此产生的 .tlb 会真正匹配我的 C# .dll 中的内容。我什至不知道平台 midl.exe 是否以这种方式工作,但假设它确实如此。

  1. 我在吠叫错误的树吗?是否可以通过相应的 COM 接口在非托管 C++ 中使用托管 C# 接口?

  2. 在其 AssemblyInfo.cs 文件中设置 [assembly: ComVisible(true)] 属性是否可以通过 AssemblyInfo.cs 定义的 GUID 在非托管世界中通过 COM 使用托管程序集中的所有接口,还是我必须做更多的事情?

  3. 如何从托管的 .dll 中获取类型库,以便我的非托管 C++ 库可以#import 它?

  4. 我尝试将我的托管 C# 库项目作为参考添加到非托管 C++ 库项目中,但这似乎没有帮助。在这种情况下,这样的参考是否相关?

  5. 有没有更好的方法来解决从非托管 C++ 世界调用托管 C# 代码的基本问题?我刚刚在这里读到的内容是一个混合模式库,它带有一个托管翻译层,以弥合非托管/托管差距。我不确定这是一个好的策略,因为呼叫响应速度是一个重要因素,但从长远来看可能会更好,因为我计划在某个时候将 UI 重写为托管 C#,从而将所有的努力都放在抛弃 UI 而不是使用更永久的业务/通信逻辑?不管这个问题的答案如何,我仍然想解决使用 COM 的问题,如果只是出于好奇。