问题标签 [c++-cli]

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 回答
1488 浏览

c++-cli - 我可以阻止 C++/CLI 将 IDisposable 添加到我的 ref 类吗?

IDisposable当您在 ref 类上实现析构函数时,C++/CLI 会为您生成脚手架。此外,如果您没有实现析构函数,但您的类有一个成员变量 implements IDisposable,那么IDisposable它会再次在您的类上自动实现。IDisposable它非常有用,并且比C# 中的处理方式要好得多。

在实现一个持有msclr::com::ptr(包含 RCW 的智能指针)的 ref 类时,我遇到了这种行为。

我的特定情况下,我的类引用的 COM 对象不会“锁定”某些非托管资源,它实际上只是占用了 CLR 看不到的一些非托管内存。因此,我想通过不实现IDisposable该类来避免混淆我的 ref 类的用户。相反,我想通过使用 GC API 添加适当的内存压力,让 CLR 知道 COM 对象的存在。

所以,问题是:有没有办法抑制IDisposable在不实现析构函数但持有IDisposable成员变量的 ref 类上的实现?

注意:这通常是错误的做法,因为它会阻止该类的用户确定性地处理底层 COM 对象,但考虑到特定情况,暴露IDisposable可能会混淆我的 ref 类的用户,因为它确实不需要 Dispose 有问题的 ref 类。

我想一种选择是在没有析构函数的情况下实现 msclr::com::ptr 的变体。

任何其他抑制自动添加 IDisposable 的方法将不胜感激。谢谢。


回答

声明_aComObject为 msclr::com::ptr ( msclr::com::ptr<IWhatever>^) 的句柄。编译器不会将其Test视为 comptr 对象的“所有者”,并且不会在删除 Test 时释放它。

0 投票
2 回答
1047 浏览

msbuild - MSBuild 无法构建 C++/CLI 友元程序集

我有 Visual Studio 2008 SP1,两个 C++/CLI 项目,比如说 proj1 和 proj2。proj2 依赖于 proj1,但方式很奇怪(见下文)。在项目依赖项中,我指定 proj2 依赖于 proj1。proj2 参考也包括 proj1。然后我希望 proj1 成为 proj2 的朋友,因此,正如“Friend Assemblies”上的 MSDN 页面所说,我在 proj2 的某处写了这段代码:

编译说 proj1.dll 已经被引用,我应该从 proj2 项目设置中删除项目引用(从而删除 /FU 标志)。

这里出现了错误(?):如果我从 proj2 中删除 proj1 引用,但仍然在解决方案 Project Dependencies 中指定 proj2 依赖于 proj1,那么在 VS2008 中一切都可以编译。但是 MSBUILD 解析项目引用,为 proj2 创建新的临时项目,添加 /FU:proj1.dll 和构建失败!

问题 1:有没有办法禁用此 MSBuild 行为?

然后,如果我删除项目依赖项中的依赖项,MSBuild 构建良好,但 Visual Studio 尝试并行编译 proj1 和 proj2,但失败,因为 proj2 小得多并且首先编译...在项目和解决方案中设置最大并行构建选项/ Build and Run 有帮助,但我必须在每台开发人员机器上都这样做,我无法在解决方案中保存此设置,这会使构建速度变慢等等......

问题2:有没有办法让“项目依赖”成为条件选项?我希望它适用于 VS2008 和 MSBuild ......

0 投票
4 回答
487 浏览

namespaces - 在命名空间声明之后立即添加“使用命名空间”是否可以接受?

我有一个包含一些类型定义的小命名空间,我用它来使我的代码看起来更干净。但是,我不想为每个使用其中一种类型的文件添加“使用命名空间...”行,毕竟我已经为文件添加了#include。


我的文件.cpp:


typedefs.h:


在命名空间声明之后立即添加“使用命名空间”行是否可以接受?如果不是,为什么不呢?

0 投票
1 回答
1088 浏览

events - C++/CLI 为事件生成丑陋的 raise_XXX 方法

我正在用 C++/CLI 编写我的自定义事件(我几乎只关心添加/删除方法),如下所示:

一切都很好,但是当我查看 C# 下的 Intellisense 时,它​​显示了一个丑陋的公共 raise_Xyz 方法。

关于如何在不将我的活动设为私有的情况下隐藏它的任何想法?

非常感谢任何帮助。

编辑:

我能够通过使用不同的可见性修饰符(在我的情况下是内部的)标记它们来消除公共 raise_Xyz 方法。这几乎意味着不能从课堂之外引发事件。这对我来说没问题。然而,我注意到,即使是简单的事件

生成 raise_XXX 方法并且它们受到保护。有什么方法可以防止这种情况发生吗?

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 回答
1512 浏览

c# - 使用 C++-cli,如何实例化 C# 库中定义的 WinForms 表单?

很抱歉,如果这个问题已经得到解答,但我找不到。

我试图在调用 C++ 程序中的函数时打开 C# 表单(主程序在 C++-cli 中,表单在 C# 中,它是一个空表单,只是为了尝试它的工作原理)。我正在使用 Visual Studio 2005,我的解决方案中有两个项目。C# 项目只是一个表单,我已将其配置为类库。但是,当我转到 C++ 程序的函数时,我会在开头键入以下内容:

我在 C++ 方面的经验很少,我尝试过不同的组合,但我很不幸。C++ 项目已与 CLI 兼容。我已经包括了所需的:

我知道有一些大错误,但我只需要运行此表单,不再需要。非常感谢你。

编辑:我已经添加了参考。

0 投票
2 回答
547 浏览

.net - 是否可以事后确定 .NET 程序集是用哪种语言编写的?

这最初是作为一种查找 C++/CLI 和托管 C++ 程序集的方法,以便可以测试它们内部的所有类,以确保重新实现所有继承的方法。我想将此添加为构建过程步骤,以确保它不再发生。

考虑到这个问题也让我有点好奇,因为能够确定使用的任何 .NET 语言会很有趣。因此,我走得更远,比较了所有 .NET 语言的程序集。到目前为止,这是我通过我编写的一个小程序发现的,它通过反射比较任何一组 .NET 程序集的类型和属性数据:

  • C# - 有 AssemblyConfigurationAttribute,有 GuidAttribute
  • VB - 有许多额外的“我的”类型(例如 MyApplication、MySettings),有 GuidAttibute
  • F# - 有一个 FSharpInterfaceDataVersionAttribute,它还指定使用的编译器的版本。
  • C++(除 /clr:safe 之外的所有) - 有一堆额外的类型(FrameInfo、type_info)
  • C++ /clr:safe - 似乎没有独特的反射特性。

按此顺序解析可能是合理的:

  1. 如果它具有 FSharpInterfaceDataVersionAttribute,则为 F#
  2. 如果它在我发现的大量额外类型中有任何一个,那就是 C++。
  3. 如果它具有“My*”类型,则它是 VB。
  4. 如果它具有 AssemblyConfigurationAttribute 或 GuidAttribute,则为 C#
  5. 很可能是 C++ /clr:Safe

然而,由于这是一个可怕的 hack,我想在这里检查以确保没有其他选项可用。

0 投票
3 回答
826 浏览

c# - C++ 程序中的 C# 表单

在我的最后一个问题中,我询问了有关在 C++-cli 程序中运行 C# 表单的问题。我得到了它的工作,但我遇到了问题。我会尽量简短。

我的 C++ 程序必须执行一个 C# 表单并在其中执行一些简单的功能(增加计数器并显示它们)。但是我不知道最好的方法来做到这一点。我在 init 函数中初始化了表单:

C++-cli

...

C++ 程序中的一些其他函数只是调用incCounter。我的问题是,从另一个函数对 incCounter 的第二次调用使我的 C# Form1 为空(this == null),因此我可以使用 incCounter 的函数代码,但不能使用类变量。很奇怪,好像程序处理了FormProject。

C#

我究竟做错了什么?我实际上已经禁用了表单,只使用了函数和变量,以防问题出在 UI 上(调用等)。退出 C++ 初始化函数(第一块代码)是否清除 Form1?

0 投票
5 回答
5512 浏览

c++-cli - 如何在 C++-CLI 中创建全局句柄

我正在尝试在 C++-CLI 项目中使用 C# 类,但 Visual Studio 只允许我在函数内部声明本地范围内的 C# 对象的句柄 (^)。我让它工作的唯一方法是声明一个指向句柄的全局指针:

但是,如果我在函数内部创建一个对象并将其地址提供给全局指针:

当函数退出并且我尝试在其他一些 C++-CLI 函数中使用 incCounter 函数时,该对象似乎消失了(调试器说 this == null)。有没有办法在 C++-CLI 中拥有 C# 代码的全局句柄?我猜出于某种我不明白的原因禁止全局句柄,但我没有想法,我需要这样做。谢谢你。

编辑:

给出空引用异常。为什么?