标签: c++-cli

你如何处理C++/CLI中的句柄?

我知道我也不是在问这个问题.请帮我更好地形成我的问题.

我有点困难让我的思绪缠绕在手柄上 - 在某些方面,它看起来像指针.但与指针不同,似乎我可以直接将值赋给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有关吗?

c++-cli

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

VC2008,如何在C++/CLI项目中为单个文件关闭CLR标志

这篇文章说可以关闭单个.cpp文件的CLR标志.

从帖子: 您可以单独在每个.cpp文件中打开或关闭/ CLR.为整个项目打开它.如您所做,然后关闭仅包含本机(非托管)代码的文件.当您打开VC++ procject属性对话框时,仍然可以单击解决方案资源管理器中的文件/项目来更改您正在处理的范围.单击非托管.cpp文件以仅为该文件设置选项.

这是真的?我无法弄清楚如何通过我的C++/CLI项目的属性页面来做到这一点.我怎么做到这一点?

clr c++-cli visual-studio-2008

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

Visual C++ .net vs C++

请问任何人都可以指出C++和Visual C++ .net之间的主要区别?Visual C++ .net是一个托管代码,如C#和VB?它使用相同的FCL和BCL吗?可以从Visual C++ .Net项目中消耗C#和VB dll吗?

.net c++ c++-cli

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

无法将类型'System.ValueType'隐式转换为'int?'

我有一个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定义为引用时,它就是我所说的.我可以离开演员并继续前进,还是我做错了什么?

.net c# nullable c++-cli

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

为什么Threading :: Monitor :: TryEnter不止一次成功?

我正在尝试保护一些多线程代码,并且我正在添加单元测试以证明我已经修复了我们之前看到的腐败.

尽管我遇到了一些意想不到的行为.当文档表明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)

.net multithreading unit-testing c++-cli monitor

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

将C#dll导入C++托管代码(.NET)

我正在使用Visual Studio 2010.我在C#中编写了一个dll,然后管理了dll.现在由于某种原因,我需要用C++编写一个软件(.NET然后也管理).我需要将C#dll导入到我的C++ .NET代码中.我不知道这样做,我做了几次搜索,但这个问题似乎没有被涵盖.例如,在C#中我没有包含文件,那么我的C++(.NET)项目如何知道dll中的类和函数?谢谢,

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

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

如何将System.Net命名空间用于Visual Studio 2010 c ++项目?

我很难将System.Net命名空间从.NET导入到我的C++项目中.

我已经尝试过使用:"using namespace System.Net"但我想我需要将一些DLL导入我的项目属性才能使这个语句有效.我怎样才能做到这一点?有人对如何克服这个问题有任何意见吗?或者我做错了什么?

c++ import dll namespaces c++-cli

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

*用于C++ CLI的var*关键字

我想将一行数据库数据存储到一个对象中,但我不知道在C#中是否存在类似于var的关键字.因为我想检索整个行数据而不是任何特定列.

C#:

var data=from t in TableX 
         where t.id==100
         select t;
Run Code Online (Sandbox Code Playgroud)

c++ c++-cli

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

我应该在C++/CLI类中使用C#对象的引用还是实例?

在托管的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++-cli

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

带有类型推导的C++/CLI静态对象会导致未处理的运行时异常

建立

在尝试在本地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)

.net c++-cli

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