我正在创建一个包含32位和64位版本的本机库的包装器.我有一个相当复杂的C++/CLR项目,其中包含来自本机库的许多头文件.我让它在x32上工作正常,但现在我不知道如何提供替代的x64构建.
有人可以概述创建此类项目的步骤吗?
#pragma comment (lib, "xxxxxx.lib").该如何改变?最后 - VS2008只列出了Win32平台,而不是Win64(我确实安装了x64 VS2008组件).
谢谢!
我正在用C++/CLI(VS2008)编写一个泛型类来存储和管理不同类型的记录,我需要集合来保存它们,然后再将它们刷新到DB/disk/etc. 我在考虑这样的事情:
ref class Record
{
// ...
};
generic<typename T>
where T : Record, gcnew()
public ref class Factory
{
public:
// ....functions....
protected:
array<T^> ^ StoredData;
};
Run Code Online (Sandbox Code Playgroud)
当然,错误C3229失败了(不允许对泛型类型参数进行间接).如果我删除'^',则错误是C3149(此处不能使用此类型而没有顶级'^').这很容易在VB.Net中完成(事实上,我正在迁移现有的VB.Net类!),但在C++中,我似乎已经走到了死胡同.这在C++/CLI中实际上是不可能的吗?
提前致谢.
我是C++/CLI的初学者,因为我来自C#背景.我目前正在编写一些本机C++代码的包装器.我有以下方法:
void AddToBlockList(System::String^ address)
{
char* cAddress = (char*)(void*)Marshal::StringToHGlobalAnsi(address);
_packetFilter->AddToBlockList(cAddress);
}
void AddToBlockList(IPAddress^ address)
{
char* cAddress = (char*)(void*)Marshal::StringToHGlobalAnsi(address.ToString());
_packetFilter->AddToBlockList(cAddress);
}
Run Code Online (Sandbox Code Playgroud)
...第一种方法工作正常,并将我的字符串转换为字符数组.但是,IPAddress对象作为签名的第二个函数给出了以下错误:
Run Code Online (Sandbox Code Playgroud)error C2228: left of '.ToString' must have class/struct/union
......当我输入时
? address.ToString()
Run Code Online (Sandbox Code Playgroud)
...在命令窗口中,打印IP地址.不知道我哪里出错了.有任何想法吗?
可能重复:
插入符号在C++/CLI中的含义是什么?
System::String是一个班级.额外的插入符是什么意思?
System::String^ productString = L"";
Run Code Online (Sandbox Code Playgroud)
谁看过这个吗?我在Stroustrop找不到任何东西.
我在这里问了一个涉及C ++和C#通信的问题。问题得到解决,但导致了新问题。
这将返回一个字符串(C#)
return Marshal.PtrToStringAnsi(decryptsn(InpData));
Run Code Online (Sandbox Code Playgroud)
这需要一个TCHAR *(C ++)
lpAlpha2[0] = Company::Pins::Bank::Decryption::Decrypt::Decryption("123456");
Run Code Online (Sandbox Code Playgroud)
我已经用谷歌搜索了如何解决这个问题,但是我不确定为什么字符串上有一个胡萝卜(^)。最好将String的返回值更改为C ++可以接受的其他值吗?还是我需要在分配值之前进行转换?
我想用标准的,独立于平台的C++编写一个算法库.
然后,我可以使用相同的C++代码并为.NET编译它,以便C#应用程序可以使用该库吗?如果没有,实现这种互操作的最简单方法是什么?
我正在使用ReSharper来运行在C#/ NUnit中开发的单元测试.当我对C++/CLI类进行单元测试时,我的所有测试都会通过,但随后弹出以下消息框; "任务运行者应用程序已停止工作".我正在测试的类没有任何不受管理的东西:
public ref class MyClass
{
public:
MyClass(
array<double>^ rawPrices,
array<DateTime>^ priceDates)
{
// some unmanaged C++ code runs here
}
(snip)
~MyClass()
{
}
private:
int numDays;
array<double>^ Prices;
array<double>^ Discounts;
};
Run Code Online (Sandbox Code Playgroud)
当所有测试都成功时,会弹出消息.但是,当我切换到调试单元测试时,测试才成功.我正在测试的库是在Release x64模式下编译的.
这种奇特的行为是否表明MyClass有问题?
#pragma managed(push, off)和之间有什么区别#pragma managed(push, on)?
当我们需要使用#pragma managed(push, on)而不是#pragma managed(push, off)?
如何导出C++/CLI项目中定义的本机类的方法?这就是我所拥有的:
.h文件:
#pragma once
#ifdef COMPILE_PRODUCER_LIB
#define PRODUCER_LIB_EXPORT __declspec(dllexport)
#else
#define PRODUCER_LIB_EXPORT __declspec(dllimport)
#endif
public class PRODUCER_LIB_EXPORT MySecondNativeClass {
public:
MySecondNativeClass(int val);
int getValue() const;
private:
int m_value;
};
Run Code Online (Sandbox Code Playgroud)
.cpp文件:
#include "stdafx.h"
#include "MySecondNativeClass.h"
MySecondNativeClass::MySecondNativeClass(int val) {
this->m_value = val;
}
int MySecondNativeClass::getValue() const {
return this->m_value;
}
Run Code Online (Sandbox Code Playgroud)
在同一个项目中使用此类工作正常,但在另一个(C++/CLI)项目中使用它会给我"未解析的外部符号"链接器错误.(COMPILE_PRODUCER_LIB是仅在包含类的项目中定义的预处理器定义.)
我已经创建了一个小的解决方案(针对Visual Studio 2010),它显示了问题(在本页末尾下载).在那里,本机类MySecondNativeClass在项目"ManagedProviderLib"中定义,并在"ExternalTestClass.cpp"中使用(在项目"ManagedExternalLib"中).
c++-cli ×10
visual-c++ ×4
.net ×2
managed-c++ ×2
64-bit ×1
c# ×1
casting ×1
collections ×1
dllexport ×1
generics ×1
interop ×1
pragma ×1
resharper ×1
tchar ×1
unit-testing ×1