Tag: c ++ cli

跨C#和C ++ / CLI对象的垃圾收集

我目前正在研究使用C ++ / CLI来弥补托管C#和本机非托管C ++代码之间的差距。 我想要解决的一个特殊问题是C#和C ++中不同的数据类型的转换。 在阅读使用这种桥接方法以及所涉及的性能影响的同时,我想知道垃圾收集如何工作。 具体来说,如果垃圾收集器在“另一侧”被引用/销毁,它们将如何处理在任一侧创建的对象的清理。 到目前为止,我已经阅读了有关StackOverflow和MSDN的各种文章和论坛问题,这让我相信垃圾收集器在同一个进程中运行时应该跨两种类型的代码工作 – 即如果一个对象是用C#创建的,传递给C ++ / CLI桥接器,在双方的引用不再使用之前不会收集它。 在这种情况下,我的问题分为三个部分: 我是否正确地得出结论,当在同一个进程中运行时,垃圾收集器可以跨代码的两个部分(C#和C ++ / CLI)工作? 关于1:在这种情况下它是如何工作的(特别是在清理两个代码库引用的对象方面)。 是否有关于如何监视垃圾收集器活动的建议 – 即编写测试以检查垃圾收集何时发生; 或监视垃圾收集器本身的程序。 我已经对垃圾收集器的工作原理有了一些了解,所以我的问题特定于以下场景: 组件 大会A – (用C#编写) 程序集B – (用C ++ / CLI编写) 程序执行 对象O在程序集A中创建。 对象O被传递到Assembly B内的一个函数中。 已发布对程序集A中对象O引用。 程序集B保持对对象O引用。 执行结束(即通过程序退出)。 程序集B释放对象O引用。 提前感谢您对此问题的任何想法。 如果需要进一步的信息或者某些内容不够清楚,请告诉我。 编辑 根据要求,我已经写了一个我想要描述的场景的粗略示例。 可以在PasteBin上找到C#和C ++ / CLI代码。

从托管代码调用C代码

我目前有一个C函数,我想在.NET(C#)中使用。 我可以看到实现这个目标的两种方法: 用VC ++ .NET上的/ clr编译它(我认为这是可能的),实现了调用C代码的“façade”托管方法。 将C代码编译为DLL,然后进行API调用。 你觉得什么最好? 如何做到第一个? 更新 根据要求,这是我需要从托管代码调用的(唯一)函数: int new_game(double* params1, double* params2); 还有一个问题(虽然更难) 我有一个表单的function int my_hard_to_interop_function(double** input, double **output, int width); 其中输入和输出都是2D双数组。 它们的宽度由width给出,它们的高度由函数知道。 我应该从我的C#应用​​程序中调用这个C方法。

使用c ++ dll在c#app中堆栈溢出

我有一个使用c ++ / cli托管dll的ac#程序。 该DLL包含许多遗留代码,包含相当多的win32窗口。 问题是,dll中的窗口需要比平均咳嗽更多的堆栈空间。 由于这些不是后台进程而是win32 api我需要扩大GUI线程的堆栈大小(至少我认为dll中的win32 api将使用主gui进程)。 所以我需要一种方法来扩大ac#process中GUI线程的大小。 由于我没有找到任何设置来实现这一点,我从命令行尝试了editbin / STACK,这是有效的。 问题是,它只能在命令行中运行,如果我尝试将其作为post-build-step输入,由于某种原因二进制的堆栈大小不会改变,即使postbuild步骤正确执行并且没有抛出错误:( editbin.exe /STACK:2097152 $(TargetPath) (Editbin.exe在路径中,输出窗口中没有错误) 那么如何为我的c ++ dll获得更多的堆栈大小? [更新] 我注意到使用editbin.exe时出现问题。 这在命令行和后期构建步骤中都不起作用: editbin.exe /STACK:2097152 c:\some\path\bin\release\app.exe 这在命令行中有效,但不能作为构建步骤: editbin.exe /STACK:2097152 app.exe 但我需要它作为后期构建步骤。 我试着把它放到一个批处理文件中,回显以确保调用和工作目录都可以,但它仍然不起作用。 奇怪。

在C#中使用C ++ CLI模板类

我在C ++ / CLI中有以下类和int原语的显式模板实例化。 template public ref class Number { T _value; public: static property T MinValue { T get() { return T::MinValue; } } static property T MaxValue { T get() { return T::MaxValue; } } property T Value { T get() { return _value; } void set(T value) { if( value MaxValue) throw […]

为什么调试C#项目会显示C ++ / CLI符号?

我对一些C#库和控制台项目(但不是我从头创建的那些)有一个奇怪的问题,他们使用C ++ / CLI表示法显示手表和智能标签进行调试(例如,显示System::Object^在哪里我期望System.Object ): 我已经尝试更改项目guids,因为我认为这是问题(有些已经改变),删除obj / debug文件夹,重新启动Visual Studio 2010,修复Visual Studio 2010甚至旧的collections重新启动Windows。 是否有任何明显的设置我错过了以某种方式被启用?

如何在托管C ++中使用typeof(int)?

我现在正在开发一个项目,其中一部分使用托管C ++。 在托管C ++代码中,我正在创建一个DataTable。 在为数据表定义Columns时,我需要指定列的类型。 在C#中,这将: typeof运算(INT) 但是我如何在托管C ++中做到这一点? 谢谢!

将ISO C ++类暴露给C#

我需要向C#公开一些C ++类(我在Linux上构建,使用mono,因此COM不是一个选项) 到目前为止我收集的证据表明,解决这个问题的最佳方法是: 在ISO C ++类周围编写一个包装器C ++ .Net类 从C#中使用C ++ .Net类 我有以下问题: 首先,这是实现将C ++类暴露给C#的目标的“最佳”方式吗? 到目前为止,我还没有看到任何实际显示如何执行此操作的示例 – 任何人都可以建议一些链接,或者代码片段来显示如何为虚拟类完成此操作? 如何从C ++代码向C#代码发送异步消息通知? 理想情况下,我想使C#类引发事件,并将接收到的数据作为参数

从C ++回调到C#的回调

说我有一个用于计算PI的C ++库函数: // pi.h: #ifdef BUILDING_DLL #define DLL_MACRO __declspec(dllexport) #else #define DLL_MACRO __declspec(dllimport) #endif namespace Cpp { class PI { public: static double DLL_MACRO compute(); }; }; // pi.cpp: #include “pi.h” #include double Cpp::PI::compute() { // Leibnitz summation formulae: double sum = 0.0; for(long n = 0; n < 100*1000*1000; n++) sum += 4.0*pow(-1.0, n)/(2*n […]

从C#/ .NET调用C ++函数

我有一个有C ++项目和C#项目的解决方案。 C ++项目定义了一个类,我想在C#中实例化并调用其成员函数。 到目前为止,我设法实例化了这个类: CFoo Bar = new CFoo(); 但是当我尝试在其上调用函数时,编译器说,它不可用。 此外,当我在调试器中检查对象时,不会显示任何成员。 我在这里想念的是什么?

在C ++ / CLI中是可见的

我正在将C ++转换为C ++ / CLI,并希望将一些托管类公开为COM对象。 在C#中它很容易并且设置[ComVisible]并inheritance自接口(也是ComVisible)完成了这项工作。 但是,作为C ++ / CLI的C ++项目构建不会导出DllRegisterServer。 这是示例项目(从VS 2008中的CLR控制台应用程序项目开始)。 #include “stdafx.h” using namespace System; using namespace System::Runtime::InteropServices; [ComVisible(true)] [Guid(“E3CF8A18-E4A0-4bc3-894E-E9C8648DC1F0”)] [InterfaceType(ComInterfaceType::InterfaceIsDual)] public interface class ITestInterface { void TestMethod(); }; [ComVisible(true)] [Guid(“1514adf6-7cb0-4561-9fbb-b75c0467149b”)] public ref class CliComClass : ITestInterface { public: virtual void TestMethod() { } }; int main(array ^args) { Console::WriteLine(L”Hello World”); return […]