标签: c++-cli

托管C++以形成c#和C++之间的桥梁

我有点生疏,实际上我的C++真的很生疏.从大学一年级开始就没有触及它,所以已经有一段时间了.

无论如何,我正在做与大多数人相反的事情.从C++调用C#代码.我在网上做了一些研究,似乎我需要创建一些托管C++来形成一个桥梁.使用__declspec(dllexport)然后从中创建一个dll并使用整个东西作为包装器.

但我的问题是 - 我真的很难找到例子.我找到了一些基本的东西,有人想将C#版本用于String.ToUpper(),但这是非常基本的,只是一个小代码片段.

任何人都有任何想法,我可以在哪里寻找更具体的东西?注意,我不想使用COM.目标是根本不触及C#代码.

c# clr unmanaged c++-cli

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

需要将String ^转换为char*

我使用.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)

string c++-cli char

11
推荐指数
3
解决办法
3万
查看次数

与Native C++相比,C++/CLI性能如何?

早上好,

我正在编写一个拼写检查程序,对于这种情况,它是性能关键的.既然如此,由于我打算连接到数据库并使用C#创建GUI,我在C中编写了一个编辑距离计算例程,并编译为我在C#中使用的DLL DllImport.问题是,我认为(虽然我可能是错误的),其编组字一个一个从Stringchar *导致大量的开销.就是这样,我考虑使用C++/CLI以便我可以String直接使用.NET中的类型...我的问题是,C++/CLI性能如何与用于繁重数学计算和数组访问的本机C代码相比较?

非常感谢你.

c# performance c++-cli dllimport native-code

11
推荐指数
1
解决办法
3437
查看次数

C++/CLI:防止非托管资源的托管包装上的垃圾回收

我有一个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# garbage-collection c++-cli finalizer

11
推荐指数
1
解决办法
4226
查看次数

C++:在混合使用C++/CLI和C++时获取c3859错误代码

按照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指定更高的限制

我绝对不希望这些发生,我也不知道如何解决它们.

c++ unmanaged c++-cli marshalling

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

QTAgent32.exe在执行后保持DLL的句柄打开

我使用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包装器的开放引用.

dll unit-testing c++-cli visual-studio-2010

11
推荐指数
2
解决办法
4429
查看次数

Visual Studio单元测试32位和64位

我有一个包含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++ unit-testing c++-cli visual-studio-2012

11
推荐指数
1
解决办法
3149
查看次数

如何在Release()上处理NET COM互操作对象

我有一个用托管代码(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 …

.net com interop release c++-cli

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

无法使用VS 2010,.Net 3.5和64位构建C++/CLI应用程序

我有一个在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++-cli visual-studio-2010 .net-3.5 32bit-64bit

10
推荐指数
2
解决办法
6541
查看次数

什么是CLI/C++?它与'普通'c ++有何不同?

让我先澄清"正常"C++的含义 - 我现在正在阅读Walter Savitch的"用C++解决问题".据我所知,这不是专门为微软或Unix编写的.所以我的问题是,我在本书中学到的东西(我用于获得c ++的普遍知识)与我一直在阅读的有关CLI C++的内容有何不同?

如果我使用Visual C++,CLI C++就是我会遇到的吗?我完全糊涂了.

c++ c++-cli visual-c++

10
推荐指数
2
解决办法
4986
查看次数