我知道我也不是在问这个问题.请帮我更好地形成我的问题.
我有点困难让我的思绪缠绕在手柄上 - 在某些方面,它看起来像指针.但与指针不同,似乎我可以直接将值赋给handle变量,它会影响底层数据值,而不是句柄本身.
测试代码清楚地表明,无论是否使用句柄,我都得到相同的值,或者如果我"取消引用"句柄来获取数据.显然,这不适用于非托管指针.我不明白的是什么?
#include <iostream>
int main()
{
int ^y;
int ^a, ^b, ^c;
long x;
y= gcnew int(100);
a=y;
b=y;
c=y;
c= gcnew int(200);
b= 300;
System::Console::WriteLine(y); // returns 100 (instead of something pointer-like)
System::Console::WriteLine(*y); // also returns 100
System::Console::WriteLine(a); // 100
System::Console::WriteLine(b); // 300
System::Console::WriteLine(c); // 200
x = static_cast<long>(y);
*y = 10;
System::Console::WriteLine(x); // 10
System::Console::WriteLine(y); // 10
System::Console::WriteLine(*y); // 10
}
Run Code Online (Sandbox Code Playgroud)
编辑添加 - 我怀疑WirteLine可能已经为我做了解除引用,但我原本预计静态强制转换不会.这与autounboxing有关吗?
这篇文章说可以关闭单个.cpp文件的CLR标志.
从帖子: 您可以单独在每个.cpp文件中打开或关闭/ CLR.为整个项目打开它.如您所做,然后关闭仅包含本机(非托管)代码的文件.当您打开VC++ procject属性对话框时,仍然可以单击解决方案资源管理器中的文件/项目来更改您正在处理的范围.单击非托管.cpp文件以仅为该文件设置选项.
这是真的?我无法弄清楚如何通过我的C++/CLI项目的属性页面来做到这一点.我怎么做到这一点?
请问任何人都可以指出C++和Visual C++ .net之间的主要区别?Visual C++ .net是一个托管代码,如C#和VB?它使用相同的FCL和BCL吗?可以从Visual C++ .Net项目中消耗C#和VB dll吗?
我有一个C++/CLI包装类,用于在C#和本机C++之间进行交互.我得到一个与之相关的奇怪错误System.Nullable.我理解,对于基本类型,System.Nullable<T>相当于T?.所以我这样做:
C#:
public int? RoboticsArmRotation {
get { return mRobotics.ArmRotation; }
}
Run Code Online (Sandbox Code Playgroud)
C++/CLI,界面:
virtual property System::Nullable<int>^ ArmRotation{ System::Nullable<int>^ get() = 0; }
Run Code Online (Sandbox Code Playgroud)
C++/CLI,具体类:
virtual property System::Nullable<int>^ ArmRotation {
System::Nullable<int>^ get() {
boost::optional<int> value = m_pNativeInstance->getArmRotation();
return value.is_initialized()? gcnew System::Nullable<int>(value.get()) : gcnew System::Nullable<int>();
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到了标题的编译错误.为了int?解决它而进行的转换,但是System.ValueType当我将可以为空的nullable定义为引用时,它就是我所说的.我可以离开演员并继续前进,还是我做错了什么?
我正在尝试保护一些多线程代码,并且我正在添加单元测试以证明我已经修复了我们之前看到的腐败.
尽管我遇到了一些意想不到的行为.当文档表明TryEnter只有在函数实现独占锁定时才返回true时,为什么以下代码成功?
const int msToWaitForLock = 1;
Object^ syncObj = gcnew Object();
bool gotLock = Threading::Monitor::TryEnter(syncObj, msToWaitForLock); // <-- this succeeds as expected
bool gotSecondLock = Threading::Monitor::TryEnter(syncObj, msToWaitForLock); // <-- but why the heck does this succeed?!
Run Code Online (Sandbox Code Playgroud) 我正在使用Visual Studio 2010.我在C#中编写了一个dll,然后管理了dll.现在由于某种原因,我需要用C++编写一个软件(.NET然后也管理).我需要将C#dll导入到我的C++ .NET代码中.我不知道这样做,我做了几次搜索,但这个问题似乎没有被涵盖.例如,在C#中我没有包含文件,那么我的C++(.NET)项目如何知道dll中的类和函数?谢谢,
我很难将System.Net命名空间从.NET导入到我的C++项目中.
我已经尝试过使用:"using namespace System.Net"但我想我需要将一些DLL导入我的项目属性才能使这个语句有效.我怎样才能做到这一点?有人对如何克服这个问题有任何意见吗?或者我做错了什么?
我想将一行数据库数据存储到一个对象中,但我不知道在C#中是否存在类似于var的关键字.因为我想检索整个行数据而不是任何特定列.
C#:
var data=from t in TableX
where t.id==100
select t;
Run Code Online (Sandbox Code Playgroud) 在托管的c ++类中,我应该使用我在另一个库中实现的C#类的引用还是实例?
考虑这个例子:
// MyManagedClass.h
#pragma once
using namespace System::Collections::Generic;
using namespace My::Namespace::MyCSharpLib;
namespace My::Namespace::MyManagedLib
{
public ref class MyManagedClass
{
public:
MyCSharpClass myInst; // i have an instance!
MyCSharpClass ^myRef; // need to do gcnew
List<MyCSharpClass ^> listInst; // i have an instance!
List<MyCSharpClass ^> ^listRef; // need to do gcnew
};
}
Run Code Online (Sandbox Code Playgroud)
然后从C#代码调用托管类:
// driver.cs
using My.Namespace.MyCSharpLib;
using My.Namespace.MyManagedLib;
public class Driver
{
private static void Main(string[] args)
{
MyManagedClass mmc = new MyManagedClass();
DoStuff(mmc);
}
}
Run Code Online (Sandbox Code Playgroud)
我的直觉告诉我,我应该使用 …
建立
在尝试在本地C++库的C++/CLI包装器中的翻译单元范围创建静态对象时,我遇到了使用auto关键字的问题.C++/CLI包装器纯粹是功能性的,因此我需要使用ConcurrentDictionary在调用之间保持一些状态(以处理Managed < - > Native委托转换).我第一次尝试这个(简化):
static ConcurrentDictionary<String^, String^>^ GlobalData1 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
但这无法编译:
具有静态存储持续时间的变量不能具有句柄或跟踪引用类型
为简单起见,我决定继续使用类型推导,同时我发现了问题:
static auto GlobalData3 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是这个编译和链接!我继续编写了一段时间的代码,然后运行了使用C++/CLI包装器的C#测试应用程序并收到了未处理的运行时异常:
未处理的异常:System.IO.FileLoadException:无法加载文件或程序集'DotNetTestLibWrapper,Version = 1.0.6111.33189,Culture = neutral,PublicKeyToken = null'或其依赖项之一.无法找到或加载类型.(来自HRESULT的异常:0x80131522)---> System.TypeLoadException:从程序集'DotNetTestLibWrapper中输入'',Version = 1.0.6111.33189,Culture = neutral,PublicKeyToken = null'具有非法类型的字段.
自从我做了其他编辑后,我没有立即知道问题是什么.我终于通过打开Fusion日志和使用Fuslogvw.exe获得了更多信息.问题在于推断类型的静态ConcurrentDictionary.
我创建了一个SSCCE来演示这个问题:https://github.com/calebwherry/DotNetWrapperForNativeCppLibrary
这篇文章中描述的代码位于:https://github.com/calebwherry/DotNetWrapperForNativeCppLibrary/blob/master/DotNetTestLibWrapper/DotNetTestLibWrapper.cpp
MSVS版本:
Microsoft Visual Studio社区2015版本14.0.25431.01更新3 Microsoft .NET Framework版本4.6.01038
题
这些都会导致编译错误:
static ConcurrentDictionary<String^, String^>^ GlobalData1 = gcnew ConcurrentDictionary<String^, String^>();
static auto^ GlobalData2 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
但是这会编译+链接,但会导致关于非法类型的未处理的运行时异常:
static auto GlobalData3 = gcnew …Run Code Online (Sandbox Code Playgroud)