标签: c++-cli

C++/CLI:从非托管枚举转换为托管枚举

从本机代码enum转换为enum包含相同enum值的托管代码的正确方法(在C++/CLI中)是什么?使用C#方式进行(int)编译是否有任何区别,例如在C++/CLI中.

enums casting native c++-cli managed

28
推荐指数
1
解决办法
2万
查看次数

使用marshal.h进行编译时出现问题:错误C2872:'IServiceProvider':模糊符号

我试图在我的C++/CLI项目中使用编组库.编译时#include <msclr/marshal.h>我得到错误error C2872: 'IServiceProvider' : ambiguous symbol.大多数决议似乎暗示#include <windows.h> 像这里的那样 - > 模糊的引用,但我没有那些包括.我只有:

using namespace System;
using namespace System::Configuration;
using namespace std;
#include <msclr/marshal.h>
Run Code Online (Sandbox Code Playgroud)

我该如何调试此问题?

c++-cli

28
推荐指数
2
解决办法
2万
查看次数

托管C++/CLI方法中的可选参数

在C#中使用时,如何在C++/CLI中声明具有可选参数的托管方法?

我使用OptionalDefaultParameterValue属性修饰了参数(请参阅:如何编码默认参数值),但只有Optional属性才被尊重.


C++/CLI:

public ref class MyClass1
{
 public:
  MyClass1([System::Runtime::InteropServices::Optional]
           [System::Runtime::InteropServices::DefaultParameterValue(2)]
           int myParam1)                                            ?
  {
    System::Console::WriteLine(myParam1);
  }
};
Run Code Online (Sandbox Code Playgroud)

C#:

var myInstance1 = new MyClass1();  // compiles and runs
Run Code Online (Sandbox Code Playgroud)

输出:

0
Run Code Online (Sandbox Code Playgroud)

预期产出:

2
Run Code Online (Sandbox Code Playgroud)

Visual C#IntelliSense:

MyClass1.MyClass1([int myParam1 = 0]);  // wrong default value
                                  ?
Run Code Online (Sandbox Code Playgroud)

编辑:仔细观察反汇编程序会发现C++/CLI编译器确实没有生成所需的.param [1] = int32(2)指令.Reflector显示的IL代码是错误的.

反射:

.method public hidebysig specialname rtspecialname instance void .ctor([opt] int32 myParam1) cil managed
{
    .param [1] = int32(2)  // bug
    ...
Run Code Online (Sandbox Code Playgroud)

ILDASM:

.method …
Run Code Online (Sandbox Code Playgroud)

.net c# c++-cli optional-parameters

28
推荐指数
3
解决办法
1万
查看次数

为什么称它为编组?

可能重复:
为什么编组的概念被称为这样?

为什么两种类型之间的转换称为编组!背后是什么意思Marshal,为什么我们不只是使用这个词convert,是否有任何区别.请尽量保持简单的英语.

.net c# c++-cli marshalling

28
推荐指数
5
解决办法
7439
查看次数

当我收到此错误时如何实现非托管线程安全集合:使用/ clr编译时不支持<mutex>

我有一个C++应用程序,它由非托管C++,托管C++和c#组成.在非托管部分,我正在尝试使用std :: mutex创建一个线程安全集合.

但是,当我使用互斥锁时,我收到以下错误;

错误C1189:使用/ clr或/ clr:pure进行编译时不支持#error:<mutex>.

知道为什么我不能使用互斥锁吗?有人可以推荐替换它,以便我可以创建一个线程安全的非托管集合吗?

c++ multithreading mutex c++-cli thread-safety

28
推荐指数
1
解决办法
2万
查看次数

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

我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:

typeof运算(INT)

但是我如何在托管C++中做到这一点?

谢谢!

c# c++-cli managed

27
推荐指数
1
解决办法
2万
查看次数

在C++/CLI中是否有与C#"var"关键字相同的名称?

在C#中,我喜欢这样的var情况下的关键字:

var myList = new List<MyType>();
Run Code Online (Sandbox Code Playgroud)

在C++/CLI中是否有任何等价物,或者每次都必须重复类型名称,如下所示:

List<MyType ^>^ myList = gcnew List<MyType ^>();
Run Code Online (Sandbox Code Playgroud)

到目前为止,无法在文档或Google中找到明确的声明.我正在使用Visual Studio 2008.

.net c# type-inference c++-cli

27
推荐指数
2
解决办法
3万
查看次数

C++中的"^"符号是什么?

当我在岩石下睡觉时,有一个新的符号加入了C++语言规范吗?

我刚刚遇到以下问题:

限制文本框仅接受10位数字

这表明'^'符号在某种程度上是C++的一部分(不是按位XOR的遗留意义)

是这样吗?

如果是这样,这是什么意思?(我试图谷歌问题,但谷歌没有得到满意的答案)

.net c++-cli visual-c++

27
推荐指数
3
解决办法
3万
查看次数

使用本机C++,托管c ++ cli和c#解决方案在混合模式下进行调试

我有一个多线程项目正在进行中,启动项目设置为运行我的UI的ac #project.然后有一系列基础c ++本机项目通过托管C++/CLI项目连接到C#.我在c#启动项目中启用了"启用非托管调试",当我尝试调试本机代码时,我能够达到我设置的断点.但是,在我尝试再次运行并尝试再次达到断点之后,它会挂起.例如,如果我有一个循环,我尝试在每次迭代中进入它,在第二次迭代后程序挂起并且我必须强制退出.我在Visual Studio 2010中工作.调试开始证明在这个速度下不太有用,有什么方法可以排除这个问题吗?

c# c++ debugging c++-cli visual-studio-2010

27
推荐指数
2
解决办法
2万
查看次数

Visual C++ 2010:对MSVC运行时部署的更改(不再使用清单的SxS)

在哪里可以找到一些官方说明,kb文章或其他描述Visual Studio 2010 C/C++运行时链接和部署策略更改的文档?

在Visual Studio 2008(使用VC90运行时)下,清单嵌入在本机映像中,运行时库部署为并行程序集(WinSxS).使用VS 2008 SP1重建本机exe或库时,这会导致问题,因为嵌入式清单需要更新版本的C++运行时.

对于VS 2010和MSVCR100运行时版本,策略似乎已完全更改.

  1. 文件msvcr100.dll和其他C/C++运行时库不再作为SxS程序集安装.
  2. 在VS2010下进行编译时,嵌入式清单中不会添加运行时"依赖"条目,这意味着可能会在运行时加载任何版本的msvcr100.dll.
  3. 在安装了.NET 4的计算机上,匹配的运行时名为msvcr100_clr0400.dll,并且不会被本机代码加载,但重命名为msvcr100.dll的副本可以正常工作.我认为这意味着任何使用C/C++代码的进程总是会加载两个版本的相同C/C++运行时.

这似乎是政策的一个重大变化,从SxS部署的回溯和我们在VS 2008下的清单依赖性.任何人都可以更好地了解变化的内容,并且可能指向一些文档,描述这些变化的自述文件或博客文章,动机和相关影响?

它认为这种方式更好 - 强大的版本清单和SxS部署是一场噩梦 - 但我对VS 2010中这些意外且看似无证的变化感到惊讶.

额外问题:如何在VS 2010下编译我的C++/CLI库以链接到msvcr100_clr0400.dll而不是msvcr100.dll?这个想法是C++/CLI程序集应该运行时没有.NET 4安装的依赖项(没有静态链接).

winsxs c++-cli visual-studio-2010 msvcr100.dll

27
推荐指数
2
解决办法
9680
查看次数