从本机代码enum转换为enum包含相同enum值的托管代码的正确方法(在C++/CLI中)是什么?使用C#方式进行(int)编译是否有任何区别,例如在C++/CLI中.
我试图在我的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#中使用时,如何在C++/CLI中声明具有可选参数的托管方法?
我使用Optional和DefaultParameterValue属性修饰了参数(请参阅:如何编码默认参数值),但只有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) 可能重复:
为什么编组的概念被称为这样?
为什么两种类型之间的转换称为编组!背后是什么意思Marshal,为什么我们不只是使用这个词convert,是否有任何区别.请尽量保持简单的英语.
我有一个C++应用程序,它由非托管C++,托管C++和c#组成.在非托管部分,我正在尝试使用std :: mutex创建一个线程安全集合.
但是,当我使用互斥锁时,我收到以下错误;
错误C1189:使用/ clr或/ clr:pure进行编译时不支持#error:<mutex>.
知道为什么我不能使用互斥锁吗?有人可以推荐替换它,以便我可以创建一个线程安全的非托管集合吗?
我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:
typeof运算(INT)
但是我如何在托管C++中做到这一点?
谢谢!
在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.
当我在岩石下睡觉时,有一个新的符号加入了C++语言规范吗?
我刚刚遇到以下问题:
这表明'^'符号在某种程度上是C++的一部分(不是按位XOR的遗留意义)
是这样吗?
如果是这样,这是什么意思?(我试图谷歌问题,但谷歌没有得到满意的答案)
我有一个多线程项目正在进行中,启动项目设置为运行我的UI的ac #project.然后有一系列基础c ++本机项目通过托管C++/CLI项目连接到C#.我在c#启动项目中启用了"启用非托管调试",当我尝试调试本机代码时,我能够达到我设置的断点.但是,在我尝试再次运行并尝试再次达到断点之后,它会挂起.例如,如果我有一个循环,我尝试在每次迭代中进入它,在第二次迭代后程序挂起并且我必须强制退出.我在Visual Studio 2010中工作.调试开始证明在这个速度下不太有用,有什么方法可以排除这个问题吗?
在哪里可以找到一些官方说明,kb文章或其他描述Visual Studio 2010 C/C++运行时链接和部署策略更改的文档?
在Visual Studio 2008(使用VC90运行时)下,清单嵌入在本机映像中,运行时库部署为并行程序集(WinSxS).使用VS 2008 SP1重建本机exe或库时,这会导致问题,因为嵌入式清单需要更新版本的C++运行时.
对于VS 2010和MSVCR100运行时版本,策略似乎已完全更改.
这似乎是政策的一个重大变化,从SxS部署的回溯和我们在VS 2008下的清单依赖性.任何人都可以更好地了解变化的内容,并且可能指向一些文档,描述这些变化的自述文件或博客文章,动机和相关影响?
它认为这种方式更好 - 强大的版本清单和SxS部署是一场噩梦 - 但我对VS 2010中这些意外且看似无证的变化感到惊讶.
额外问题:如何在VS 2010下编译我的C++/CLI库以链接到msvcr100_clr0400.dll而不是msvcr100.dll?这个想法是C++/CLI程序集应该运行时没有.NET 4安装的依赖项(没有静态链接).
c++-cli ×10
c# ×5
.net ×4
c++ ×2
managed ×2
casting ×1
debugging ×1
enums ×1
marshalling ×1
msvcr100.dll ×1
mutex ×1
native ×1
visual-c++ ×1
winsxs ×1