我希望声明并初始化一维托管数组.
如果它是C#代码,我会这样写:
VdbMethodInfo[] methods = new VdbMethodInfo[] {
new VdbMethodInfo("Method1"),
new VdbMethodInfo("Method2")
};
Run Code Online (Sandbox Code Playgroud)
我想在托管C++中写(实际上,我正在编写一个程序生成)同样的东西...
到目前为止,我有:
typedef array<VdbMethodInfo^, 1> MethodArray;
// How do I avoid pre-declaring the size of the array up front?
MethodArray^ methods = gcnew MethodArray(2);
methods[0] = gcnew VdbMethodInfo("Method1");
methods[1] = gcnew VdbMethodInfo("Method2");
Run Code Online (Sandbox Code Playgroud)
这有两个问题:
Managed C++中的GC数组是否有"数组初始化"语法?什么是正确的语法?是否有关于此问题和其他类似问题的良好网络链接?
我们有很多使用boost :: serialization完美序列化的本机c ++类.
现在我们想将一些成员字段更改为property,因此我们可以在PropertyGrids中使用它们.当我们将类定义更改为ref class X时,我们得到了大量的编译错误:
#1:
error C2893: Failed to specialize function template 'boost::archive::text_oarchive &boost::archive::detail::interface_oarchive<Archive>::operator <<(T &)' d:\someAddress\someFile.cpp 58
#2:
error C2784: 'std::basic_ostream<_Elem,_Traits> &std::operator <<(std::basic_ostream<_Elem,_Traits> &,const std::_Smanip<_Arg> &)' : could not deduce template argument for 'std::basic_ostream<_Elem,_Traits> &' from 'boost::archive::text_oarchive' d:\someAddress\someFile.cpp 58
我们这里有很多小类,所以为每个类编写一个包装器会很麻烦!
这是我们使用的示例类:
ref class gps_position2
{
public:
template<class Archive>
void serialize(Archive & ar, const unsigned int version)
{
ar & seconds;
}
public:
gps_position(){};
gps_position(float s)
{
this->seconds = …Run Code Online (Sandbox Code Playgroud) 首先,我想引用这个问题:在C#和C++之间共享变量.
这似乎是我正在寻找的,但在尝试实现这一点时,我得到了一些错误.
首先这是我的代码:
C++ MyCppWrapper.h
namespace CppWrapping
{
#pragma pack(1)
public struct MyPoint
{
public:
float X;
float Y;
float Z;
unsigned char R;
unsigned char G;
unsigned char B;
unsigned char A;
}MyPoint_t;
#pragma pack()
public ref class MyCppWrapper
{
public:
MyCpplWrapper(void);
List<MyPoint>^ getData();
};
};
Run Code Online (Sandbox Code Playgroud)
C++ MyCppWrapper.cpp
List<MyPoint>^ MyCppWrapper::getData()
{
List<MyPoint>^ temp = gcnew List<MyPoint>();
for (int i = 0; i < Data.Length; i++)
{
PointT& pt = Data.points[i];
MyPoint holder = MyPoint();
holder.X = pt.x; …Run Code Online (Sandbox Code Playgroud) 我有一些本机C DLL,我从托管C++类库("Rem")调用.在"Rem"类库中,我有一个本机C++类(api)和一个托管C++类(API).
托管类(API)现在从C#控制台应用程序调用(稍后将在Web应用程序中使用).
在调试时,我可以通过我的本机代码就好了.
我的问题是,当我调试时,除了本地声明的简单类型之外,我看不到任何变量的值.
函数参数在调试器中不可用,如果我尝试将它们添加为Watch,它只是说"error:identifier'model_name'超出范围"('schema_name'是变量名)
任何结构只在快速监视和监视窗口中显示值"{...}".

如果我尝试将一个监视添加到结构中的字段,我会得到值"error:'entryList.numItems'不存在"
我已经尝试在托管C++中创建一个Console应用程序并从中进行调试,同样的事情.
我尝试取消选中Tools-> Options-> Debugging-> General-> Managed C++ Compatibility Mode,然后我根本无法进入代码(没有为断点加载符号)
在C#console app项目中,我进入了Properties-> Debug并选中了"启用本机代码调试"(并取消选中)
在C++类库中,我进入了Properties-> Debugging-> Debugger Type并尝试了"Mixed","Native","Managed"和"Auto".
关于我做错了什么的任何建议?
我将开始为代码库实现一些单元测试,该代码库是托管和非托管C++的混合.NUnit可以使用非托管代码破解它吗?还有更好的选择吗?
我是托管C++的新手.
我在一个.sln,Project Lib和Project LibTest中有两个托管C++项目.LibTest使用Lib.
Lib编译和链接很好.该项目设置为.dll.
LibTest也编译为.dll,但是当它进入链接时,我在所有Lib ::方法上得到"未解析的标记".这些方法定义在Lib .cpp文件中定义.
如果我将定义移动到Lib.h文件中,一切正常.
我已经修改了LibTest的Reference以依赖Lib项目.
我错过了什么?
编辑:好的,这正是我所拥有的,它仍然无法正常工作.
首先,我使用的是Visual Studio 2008 SP1.
其次,当我在C#中进行类似的练习时,它运行良好.
我创建了一个空的C++ CLR项目.我添加了一个Lib项目.我添加了一个托管类.VSTD生成了Lib.h和Lib.cpp.构造函数是自动生成的.
然后我在我的解决方案中添加了另一个项 我称之为LibTest.我添加了另一个名为LibTest的托管类.生成LibTest.h和LibTest.cpp.我试图在LibTest构造函数中实例化Lib,但在链接期间它只是说:
1> LibTest.obj:错误LNK2020:未解析的令牌(06000002)Lib ::.ctor
这是确切的代码:
Lib Project(编译为.dll项目)
//Lib.h
#pragma once
ref class Lib
{
public:
Lib(void);
};
//Lib.cpp
#include "Lib.h"
Lib::Lib(void)
{
}
Run Code Online (Sandbox Code Playgroud)
LibTest项目(编译为application.exe)
// LibTest.h
#pragma once
ref class LibTest
{
public:
LibTest(void);
};
// LibTest.cpp
#include "LibTest.h"
#include "Lib.h"
LibTest::LibTest(void)
{
Lib^ lib = gcnew Lib;
}
int main()
{
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我看到使用C++而不是C#的主要优点是编译为本机代码,因此我们获得了更好的性能.C#更容易,但编译为托管代码.
为什么有人会使用托管C++?它给我们带来了什么好处?
为什么Microsoft的C++/CLI不允许我通过引用传递字符串?我收到以下错误:
C3699:'&':不能在类型'System :: String'上使用此间接
从 Visual Studio 2013 跳转到 Visual Studio 2015,我注意到编译器接受托管 C++ 类中的静态自实例的方式存在一些差异。考虑这两个例子:
方法一:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return %m_Instance; }
}
private:
static CResourceManager m_Instance;
};
Run Code Online (Sandbox Code Playgroud)
方法二:
public ref class CResourceManager
{
public:
static property CResourceManager^ Instance
{
CResourceManager^ get() { return m_Instance; }
}
private:
static CResourceManager^ m_Instance = gcnew CResourceManager;
};
Run Code Online (Sandbox Code Playgroud)
方法 1 曾经在 2013 年工作,但在 2015 年无法编译。不幸的是,我手头没有确切的编译器错误,但它是“变量名前缺少分号”错误之一,基本上是说它找不到类型CResourceManager(指向静态变量声明)。
接下来是我的问题:
我非常兴奋地看到 .NET Core 3.1 和 Visual Studio 2019 的最新预览版增加了对托管 C++/CLI 项目的支持,因为这样的项目是在 .NET Framework 上保留特定项目的唯一想法。
因此,我安装了 Visual Studio Preview 16.4.0 Preview 4 以及“C++/CLI support for v142...”选项,正如预期的那样,我看到了新的 C++ CLR 模板并安装了 .NET Core 3.1 preview 2
我使用“CLR 类库(.NET Core)”模板创建了一个新项目,将文件复制到一个旧的托管 C++/CLI 项目中,稍作调整,并构建了程序集 - 太棒了!
但是,当我尝试在 .NET Core 3.1 中使用该程序集时,出现了以下致命异常:
Unhandled exception. System.BadImageFormatException: Could not load file or assembly 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'. An attempt was made to load a program with an incorrect format.
File name: 'MyAssembly, Version=2019.0.1.0, Culture=neutral, PublicKeyToken=null'
at TestApp.Program.Main(String[] …Run Code Online (Sandbox Code Playgroud)