我有点生疏,实际上我的C++真的很生疏.从大学一年级开始就没有触及它,所以已经有一段时间了.
无论如何,我正在做与大多数人相反的事情.从C++调用C#代码.我在网上做了一些研究,似乎我需要创建一些托管C++来形成一个桥梁.使用__declspec(dllexport)然后从中创建一个dll并使用整个东西作为包装器.
但我的问题是 - 我真的很难找到例子.我找到了一些基本的东西,有人想将C#版本用于String.ToUpper(),但这是非常基本的,只是一个小代码片段.
任何人都有任何想法,我可以在哪里寻找更具体的东西?注意,我不想使用COM.目标是根本不触及C#代码.
我使用.NET DateTime来获取当前日期和时间.我正在将其转换为字符串,以用作文件名的一部分.问题是保存图像的OpenCV命令需要char*而不是字符串类型,而DateTime只输出String ^类型.我该如何工作?继承人未完成的代码
String^ nowString = DateTime::Now.ToString("yyyy-MM-dd-HH:mm");
IplImage* toSave;
CvCapture* capture = cvCreateCameraCapture(0);
toSave = cvQueryFrame( capture );
cvSaveImage(nowString, toSave);
cvReleaseImage(&toSave);
cvReleaseCapture(&capture);
Run Code Online (Sandbox Code Playgroud) 早上好,
我正在编写一个拼写检查程序,对于这种情况,它是性能关键的.既然如此,由于我打算连接到数据库并使用C#创建GUI,我在C中编写了一个编辑距离计算例程,并编译为我在C#中使用的DLL DllImport.问题是,我认为(虽然我可能是错误的),其编组字一个一个从String到char *导致大量的开销.就是这样,我考虑使用C++/CLI以便我可以String直接使用.NET中的类型...我的问题是,C++/CLI性能如何与用于繁重数学计算和数组访问的本机C代码相比较?
非常感谢你.
我有一个NativeDog需要在C#中使用的C++非托管类,所以我创建了一个包装类ManagedDog.
// unmanaged C++ class
class NativeDog
{
NativeDog(...); // constructor
~NativeDog(); // destructor
...
}
// C++/CLI wrapper class
ref class ManagedDog
{
NativeDog* innerObject; // unmanaged, but private, won't be seen from C#
ManagedDog(...)
{
innerObject = new NativeDog(...);
...
}
~ManagedDog() // destructor (like Dispose() in C#)
{
// free unmanaged resources
if (innerObject)
delete innerObject;
}
!ManagedDog() // finalizer (like Finalize() in C#, in case
{ // the user forgets to dispose) …Run Code Online (Sandbox Code Playgroud) 按照C++中 Hans Passant的建议完成后 :在使用pstsdk时获取"错误C2065:'pst':未声明的标识符"?(工作),我的代码现在看起来像这样:
private:
System::Void readPstFileButton_Click(System::Object^ sender, System::EventArgs^ e) {
pstsdk::pst myfile(marshal_as<std::wstring>(fileNameTextBox->Text));
}
Run Code Online (Sandbox Code Playgroud)
我现在得到以下错误:
错误C3859:超出PCH的虚拟内存范围; 请使用'-Zm111'或更高版本的命令行选项重新编译
错误C1076:编译器限制:达到内部堆限制; 使用/ Zm指定更高的限制
我绝对不希望这些发生,我也不知道如何解决它们.
我使用Visual Studio 2010的单元测试框架遇到了一些问题.目前,QTAgent32将在测试执行完成后维护对DLL的引用.
有问题的DLL是围绕一些本机c ++代码的c ++/cli包装器.包装器公开的对象实际上从未由托管代码分配.它唯一的参考是在处理过程中进行最后检查,以确定它是否在课程的生命周期中设置.
If(_obj != null)
{
_obj.Dispose();
_obj = null;
}
Run Code Online (Sandbox Code Playgroud)
我知道这是事实,因为如果我单步执行代码并观察调试器控制台输出,我可以看到DLL的符号没有加载,直到命中if(这是有意义的).涉及的所有托管对象都实现了IDisposable,以确保所有本机对象都得到谨慎以避免内存泄漏.
基于这个问题:QTAgent32保持文件打开 我确保没有显式打开文件流(包括控制台),甚至没有使用任何文件但问题仍然存在.关于该怎么做,我的想法已经不多了.
有人可以帮忙吗?
TL; DR: QTAgent32.exe保持对从未实例化的c ++/cli包装器的开放引用.
我有一个包含C++和C++/CLI代码的项目的解决方案,以及一组使用Microsoft Unit Test Framework对所有这些进行单元测试的项目.对于C++/CLI项目,单元测试项目是C#单元测试.我目前拥有的是32位和64位平台.此外,对于每个平台,我将单元测试项目设置为32位和64位平台以匹配.
我遇到的问题是,当我切换到32位与64位时,我需要
TEST > TEST SETTINGS > DEFAULT PROCESSOR ARCHITECTURE根据需要从32位和64位转换.如果不这样做,我会收到Visual Studio的警告,即64位映像无法在32位进程中运行.这是有道理的,但肯定有一些方法可以实现自动化吗?否则,如果我在构建机器上进行批量构建,我将无法控制它,单元测试将失败.
此外,我已尝试将单元测试项目设置为AnyCPU,但此操作失败并显示"尝试加载程序格式不正确"的错误
还有更好的方法吗?
我有一个用托管代码(C++/CLI)编写的COM对象.我在标准C++中使用该对象.
当COM对象被释放时,如何强制立即调用COM对象的析构函数?如果那是不可能的,请调用我有Release()调用我的COM对象上的MyDispose()方法?
我的代码声明对象(C++/CLI):
[Guid("57ED5388-blahblah")]
[InterfaceType(ComInterfaceType::InterfaceIsIDispatch)]
[ComVisible(true)]
public interface class IFoo
{
void Doit();
};
[Guid("417E5293-blahblah")]
[ClassInterface(ClassInterfaceType::None)]
[ComVisible(true)]
public ref class Foo : IFoo
{
public:
void MyDispose();
~Foo() {MyDispose();} // This is never called
!Foo() {MyDispose();} // This is called by the garbage collector.
virtual ULONG Release() {MyDispose();} // This is never called
virtual void Doit();
};
我使用该对象的代码(本机C++):
#import "..\\Debug\\Foo.tlb" ... Bar::IFoo setup(__uuidof(Bar::Foo)); // This object comes from the .tlb. setup.Doit(); setup->Release(); // explicit release, not really necessary since …
我有一个在Visual Studio 2010下构建但使用.Net 3.5的C++/CLI应用程序.根据需要,我手动编辑了我的项目文件,添加了值为3.5的TargetFrameworkVersion,并且当我处于x86(32位)模式时能够无问题地构建它.但是,当我切换到在x64(64位)模式下构建它时,我收到以下错误:
错误MSB8014:找不到执行路径(C:\ Program Files(x86)\ Microsoft Visual Studio 9.0\VC\bin\x86_amd64).
我安装了VS 2008(9.0),但bin文件夹下没有x86_amd64目录.我试图通过添加此文件夹(以及由于目标文件中的下一行而失败的amd64文件夹)来欺骗它,然后我收到错误:
致命错误LNK1112:模块机器类型'X86'与目标机器类型'x64'冲突
我无法弄明白,因为我的项目没有明确的链接.我将它与之交互的C#程序集切换为在x64中构建(而不是任何CPU),但无济于事.
仅供参考:一切都在32位模式下正确构建.如果切换到.Net 4.0(v100),一切都可以在64位模式下正确构建.我在发布和调试模式下都会遇到相同的错误.
任何想法,将不胜感激.
让我先澄清"正常"C++的含义 - 我现在正在阅读Walter Savitch的"用C++解决问题".据我所知,这不是专门为微软或Unix编写的.所以我的问题是,我在本书中学到的东西(我用于获得c ++的普遍知识)与我一直在阅读的有关CLI C++的内容有何不同?
如果我使用Visual C++,CLI C++就是我会遇到的吗?我完全糊涂了.
c++-cli ×10
c# ×3
c++ ×3
unit-testing ×2
unmanaged ×2
.net ×1
.net-3.5 ×1
32bit-64bit ×1
char ×1
clr ×1
com ×1
dll ×1
dllimport ×1
finalizer ×1
interop ×1
marshalling ×1
native-code ×1
performance ×1
release ×1
string ×1
visual-c++ ×1