问题标签 [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 回答
270 浏览

unmanaged - 在混合 C++ .NET 应用程序中强调托管还是非托管?

我工作的应用程序是一个几乎完全用 Visual C++ 大约在 2003 年编写的 WinForms 应用程序。在我到达现场之前,由于 UI 构建框架而选择了 .NET,但绝大多数代码是在非托管领域开发的. 其中一部分是绝对必要的——我们对一些非常大的数据集进行一些实时图像处理,使用一些需要指向图像缓冲区的指针的英特尔图像处理库,我们确实不到 1% 的情况下性能有那么重要吗?

该应用程序本身是一个大型可执行文件,通过将 UI 代码链接到几个静态库而形成,每个静态库都对应一个功能子系统——数据采集、图像处理等。自从我加入以来,我通过编写托管包装器将其中几个子系统拆分为 DLL,我们在其他应用程序中重用它们,但主应用程序仍然基本上由静态链接库组成。

我的同事和我在进一步发展应该强调非托管还是托管方面存在很大分歧。除了我提到的情况外,没有规定非托管代码的性能要求。我们坚定地致力于 .NET,因此跨平台不是问题。我认为除非另有规定,否则我们应该支持托管。

上个月,我的同事开发了一组管理子系统的类;他没有将它们实现为 ref 类并将一些事件添加到 .NET 接口,而是编写了几个 Observer 实现,使用 gcroot 来保存托管客户端的句柄,并允许自己留在非托管领域。这在我看来是错误的,只是因为为什么要写一些你可以免费拥有的东西?但我想知道我是否过于刻板。

有什么想法吗?

0 投票
5 回答
46423 浏览

c# - 在 C# 应用程序中使用 C++ 类 DLL

我有一个非托管 C++ DLL,它只导出一个类(不是 COM ......它只是一个简单的 C++ 类)作为它的接口。我想在 C# 中使用这个类,但被告知它不能仅仅导入到 C# 中。

在我的 C# 应用程序中使用此类的正确方法是什么?

0 投票
2 回答
18931 浏览

c++-cli - 在 C++/CLI 中传递非托管指针

我正在创建一个依赖于众多 C++ 静态库的 C++/CLI 包装 DLL。一些函数调用期望传入非托管指针。如何正确传递它们?

此外,其他函数期望“this 指针”作为 void* 传入。传递“这个”的正确方法是什么?

这是我的班级定义...

这是我使用有问题的指针的用法......

&mClient 和“this”的使用会导致以下编译器错误... 1>.\VBLoadSimulatorDll.cpp(40) : 错误 C2664: 'CIsmaClient::Create' : 无法将参数 1 从 'cli::interior_ptr' 转换为 ' CIsmaClient **' 1> with 1> [ 1> Type=CIsmaClient * 1> ]

1>.\VBLoadSimulatorDll.cpp(40):错误 C2664:“CIsmaClient::Create”:无法将参数 5 从“VBLoadSimulator::RTPClient ^const”转换为“VOID *”

0 投票
3 回答
1320 浏览

c# - 从 C# 获取非托管 C++ 函数

我有一些权威的 ANSI 标准 C 代码。这意味着虽然我有源代码,但我不能翻译成另一种语言,也不能修改调用参数,因为这些操作会使权限失效。有超过 150 种功能。

我可以进行附带更改,例如将文件名从 .C 更改为 .CPP,以便使用 Visual Studio 2009 的 C++ 编译器进行编译,我已经这样做了。也可以添加编译器指令等。如有必要,我还可以通过包装层。

另一个限制是我的公司不希望我在任何 C# 代码中使用不安全的关键字。

我需要从 C# 程序中获取这些功能。

典型的 C/C++ 函数如下所示:
double SomeFunction(double a, double[3] vec, double[3][3] mat);
数组内容有时输入,有时输出,很少同时输入。

我首先尝试制作一个非托管 DLL(带有标记为 Extern C 的函数)。只有简单参数(int、double)的函数运行良好,但我无法确定如何编组数组。(其实我确实找到了一些示例代码,但是复制150次是极其复杂和不合理的。)

然后我在同一个解决方案中尝试了两个项目,一个在 C++ 中,另一个在 C# 中。在 C++ 项目中,我创建了一个托管函数,它只调用了标记为非托管的原始函数。这是非常干净和简单的,同样,简单的参数也很好用。但是对于数组,我找不到如何使参数类型在 C# 到 C++ 边界上匹配:(
Argument '2': cannot convert from 'double[]' to 'double*'
如上所述,我不能使用 unsafe 来获取指针)。

当然,我正在尝试做的事情必须是可能的。
获得这些功能的最佳方法是什么?
(使用上述函数的示例代码真的很酷。)

0 投票
2 回答
1367 浏览

c# - 从非托管 C++ mfc active x dll 启动 C# 对话框

有人告诉我用 C# 编写一个对话框,该对话框必须从非托管 c++ dll 实例化。我们在代码的其他地方执行此操作,只需将托管 c++ 类添加到 C++ 项目,然后从托管 c++ 类调用 C# dll。但是,我发现从我必须这样做的地方对我不起作用。我认为因为 c++ dll 是一个 MFCActiveX 项目。一旦我在此项目中的任何文件上设置了 clr,它将不再正确注册。当我尝试注册它时,我收到三个错误,然后是它注册的消息。但是,当我尝试使用它时,我得到一个 0x80040111“ClassFactory 无法提供请求的类”错误。如果有人知道这里的问题是什么,我将不胜感激。我要么需要能够完成这个(首选),要么证明这是不可能的。

谢谢

0 投票
3 回答
1048 浏览

c# - C#程序(进程)不会卸载

我有一个 C# 程序,它使用来自另一个程序集的类,并且这个类调用一个非托管 DLL 来进行一些处理。这是一个片段:

我遇到的问题是,如果我调用“Func”,我的主 C# 程序将不会卸载。当我在主窗体中调用 Close() 时,如果我在任务管理器中查看,该进程仍然存在。如果我删除对“Func”的调用,程序会很好地卸载。我已经做了一些测试,程序 Main 函数肯定会返回,所以我不确定这里发生了什么。

0 投票
4 回答
482 浏览

c# - How much of .NET is unmanaged?

Frequently when I am using the Reflector, I come across lots of unsafe code. Anyone knows how much of .NET is unmanaged/safe?

0 投票
2 回答
375 浏览

c++ - 如何使用非托管 C++ 获取 Power Point 的运行版本?

我正在使用带有 Power Point(2003 和 2007)的非托管 C++。

如何使用 IDispatch 获得 Power Point 的运行版本(2003 或 2007)?

谢谢,任何帮助都会很棒。

0 投票
6 回答
13318 浏览

c# - C# 到 C++/CLI 到 C DLL System.IO.FileNotFoundException

System.IO.FileNotFoundException: The specified module could not be found在运行调用 C++/CLI 程序集的 C# 代码时得到,该程序集又调用纯 C DLL。只要实例化调用纯 C DLL 函数的对象,就会发生这种情况。

BackingStore 是纯 C。CPPDemoViewModel 是调用 BackingStore 的 C++/CLI,它具有对 BackingStore 的引用。

我尝试了最简单的情况——添加一个新的 C# 单元测试项目,它只是试图创建一个在 CPPDemoViewModel 中定义的对象。我从 C# 项目中添加了对 CPPDemoViewModel 的引用。

只需添加对 CPPDemoViewModel 的引用,C++/CLI 测试项目就可以正常工作,因此它是在语言之间进行切换。

我正在使用带有 .Net 3.5 SP1 的 Visual Studio 2008 SP1。我在 Vista x64 上构建,但一直小心确保我的平台目标设置为 x86。

这感觉就像我错过了一些愚蠢和明显的事情,但浪费时间试图私下解决它会更愚蠢,所以我在这里让自己尴尬!

这是对移植大量遗留 C 代码的项目的测试,我将这些代码保存在 DLL 中,并使用 C++/CLI 实现的 ViewModel。

编辑 检查目录后,我可以确认没有复制BackingStore.dll。

我有使用典型的多项目解决方案创建的标准唯一项目文件夹。

令我惊讶的是,更高级别的 Debug 似乎是 C 和 C++/CLI 项目使用的公共文件夹。

WPFViewModelInCPP\Debug 包含 BackingStore.dll、CPPDemoViewModel.dll、CPPViewModelTest.dll 及其关联的 .ilk 和 .pdb 文件

WPFViewModelInCPP\CPPViewModelTestInCS\bin\Debug 包含 CPPDemoViewModel 和 CPPViewModelTestInCS .dll 和 .pdb 文件,但包含 BackingStore。但是,手动将 BackingStore 复制到该目录并不能修复该错误。

CPPDemoViewModel 具有属性Copy Local set,我假设它负责在引用 if 时复制其 DLL。我无法将 C# 项目的引用添加到纯 C DLL - 它只是说无法添加对备份存储的引用。

我不确定我是否只有一两个问题。

我可以使用老式的复制构建步骤将 BackingStore.dll 复制到任何给定的 C# 项目的目录中,尽管我希望新的 .net 模型不需要这样做。

DependencyWalker 告诉我丢失的文件是 GPSVC.dll,这表明存在安全设置问题。我怀疑这是一个红鲱鱼。

edit2 将BackingStore.dll 的手动副本与可执行文件相邻,GUI 现在可以正常工作。C# 测试项目仍然存在问题,我怀疑这是由于测试项目的运行时环境造成的,但我现在可以不用它。

0 投票
1 回答
2941 浏览

c# - 托管和非托管代码的内存分配分析器?

我的应用程序运行 C++(COM 对象)和 C# 托管代码的组合。可悲的是,我需要追查一个难以捉摸的内存泄漏。

我试过AQTime,它在纸上看起来不错,但我的应用程序在它下面运行时不断崩溃。

有什么更好的选择建议吗?