标签: c++-cli

C++/CLI中的Singleton示例?

我环顾四周,我需要一个适用于2个或更多C++/CLI文件的Singleton类的示例.

如何在C++/CLI中声明单例,而不是C#?

如何在两个或多个C++/CLI文件中共享该单例?

当我尝试共享该单例时,我不断获得可变重定义.

singleton c++-cli

12
推荐指数
1
解决办法
8187
查看次数

C++/CLI界面中仅限Getter的属性

以下C#声明的等效C++/CLI语法是什么(如果存在):

interface MyInterface
{
    int MyProperty {get;}
}
Run Code Online (Sandbox Code Playgroud)

c++-cli properties interface

12
推荐指数
1
解决办法
5799
查看次数

为Chromium编写托管包装器

今天我一直在互联网上弹跳,在阅读了很多解决方案之后,我决定写一个Chromium包装器将是一个有趣的学习经历; 更不用说我目前正在开展的几个项目是值得的.

我知道已经有一些包装在那里(awesomium,),更不要说一些基本的教程,像这样的,但是我看写我自己的包装.

我这样做的主要兴趣是,我能够创建和访问由WebKit生成的DOM结构,以便在C#中使用,在html依赖的任何javascript之前和之后都运行.我知道我可以使用HTMLAgilityPackMajestic12进行HTML解析,但我希望在经过试验和测试的引擎之上构建一些快速,高效且将在可预见的未来积极开发的引擎.WebKit是一个积极开发的布局引擎,嵌入在一些最流行的浏览器中,而V8是一个令人印象深刻的javascript引擎,因此决定使用Chromium.

看到我不关心实际渲染任何内容,而是我希望访问网页的结构,我觉得整体嵌入WebKit可能有点过分.即使在我希望javascript改变DOM的情况下,我仍然没有使用渲染结果.

总结:

我真正想要的Chromium是能够创建网页的DOM,以及(可选)使用Chromium令人印象深刻的V8引擎运行所述页面脚本以进一步操纵DOM的能力.我知道这将是一项艰巨的任务,但我很想知道你要说些什么. 简而言之,是否有人与WebKit和V8(可能通过Chromium)合作,谁可以评估这种可行性并借给我他们的专业知识(通过如何处理这个问题的建议)? 我知道我最终可以确定一种合适的方式来解决这个问题,但我希望能够加快这一过程.链接或者可能是一个相对简短而又甜蜜的高级别"我就是这样做的"是我正在寻找的(也就是说我不需要任何太过花哨的东西).

我希望我所要求的不是太过分散.如果你发现它太笼统并且想要关闭这个主题,请不要这样做,请留下评论,我会尽量缩小焦点.正如我刚刚说过的那样,自从我感冒以来,我的思绪在今天蹦蹦跳跳.

javascript c# webkit c++-cli chromium

12
推荐指数
1
解决办法
2420
查看次数

本机和托管析构函数

我有一个本机对象(C++),它有一个gcroot指向托管对象(C#)的指针.

class SomeNativeClass {
    gcroot<SomeManagedClass ^> managedClass;
};
Run Code Online (Sandbox Code Playgroud)

问题 当我在delete(someNativeClass)之前分配的本机代码中删除此类的本机实例时,managedClass实例是否会被垃圾收集,或者我是否应该显式删除它(在本机析构函数中)?

c# c++-cli

12
推荐指数
1
解决办法
1513
查看次数

为什么我的字节在加密算法的第四轮C#端口上有所不同?

我正在尝试将C++代码移植到C#,并且大多数情况下它正在工作,但是仅用于循环的前3轮.在第四轮,输入块的字节开始不同,我不明白为什么.如果我们假设C++版本是正确的实现,为什么C#代码在第四轮给出不同的结果.下面是我的结果和代码(C++/CLR和C#的控制台应用程序)

我认为输入块在传递给AES之前在每一轮创建输入块的方式有所不同(在C++中有一种方法可以转换为基础256,to_base_256from_base_256)但是在C#中我转换了将256字节数组直接写入BigInteger,然后返回字节数组.我只是不知道为什么每个都会导致前3轮相同的输入块值,而不是第4轮.

编辑: 经过更多调试后,我缩小了问题开始出现在for循环中此行的位置,当i = 2时(第3轮)

BigInteger AESResult = new BigInteger(t);
Run Code Online (Sandbox Code Playgroud)

对块的AES加密后,我的字节数组包含

23,111,30,144,117,161,87,113,157,52,215,157,130,135,20,184

但是当我使用上面的行将这些字节转换为BigInteger时,突然之间,该值上的符号翻转为负数,并且从那里开始下降.该值甚至不会像前几轮一样显示在Locals窗口中.

输出结果

第1轮

INPUT
C++ 224,144,103,1,0,0,0,0,0,0,0,0,0,0,0,0,
C#224,144,103,1,0,0,0,0,0,0,0,0 ,0,0,0,0,
AES ENCRYPTED
C++ 175,19,208,16,98,242,219,41,136,137,124,114,117,242,222,20,
C#175,19,208,16,98,242,219,41,136,137,124,214,117,242,222,20,

第2轮

INPUT
C++ 168,68,153,2,0,0,0,0,0,0,0,0,1,0,0,0,
C#168,68,153,2,0,0,0,0,0,0 ,0,0,1,0,0,0,
AES ENCRYPTED
C++ 182,186,181,102,204,32,32,232,213,226,133,59,128,225,109,
C#182,186,181,102,204,102,32,32,232,213,226,133,59,128,225,109,

第3轮

INPUT
C++ 150,126,97,5,0,0,0,0,0,0,0,0,2,0,0,0,
C#150,126,97,5,0,0,0,0,0,0 ,0,0,2,0,0,0,
AES ENCRYPTED
C++ 23,111,30,144,117,161,87,113,157,52,215,157,130,135,20,184,
C#23,111,30,144,117,161,87,113,157,52,215,157,130,135,20,184,

第4轮

INPUT
C++ 191,210,191,0,0,0,0,0,0,0,0,0,3,0,0,0,
C#191,255,174,252,0,0,0,0,0,0,0,0,3 ,0,0,0,
AES ENCRYPTED
C++ 130,187,182,115,251,12,63,157,109,110,234,35,137,208,172,203,
C#248,197,125,177,46,103,91,217,246,8,202,219,115,4,213,37,

C++ CLR控制台应用程序

// ConsoleApplication2.cpp : main project file.

#include "stdafx.h"

using namespace System;
using namespace System::Security::Cryptography;


void …
Run Code Online (Sandbox Code Playgroud)

c# encryption cryptography c++-cli

12
推荐指数
1
解决办法
348
查看次数

需要将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万
查看次数

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
查看次数

C++ CLI使用#pragma managed/unmanaged的正确方法

我正在编写一个C++/CLI应用程序,但我希望我的C++ DLL中的大多数代码都是本机运行的(即不管理).

我在模块中只有一个CLI类,其他文件都是本机C++.

那么,确保这些本地类运行的最佳方法是什么......嗯,本机?

我是不是该:

  • A)将#pragma unmanaged添加到每个本机类的顶部
  • B)只需在我的单个CLI类中的包含之前添加#pragma unmanaged
  • C)还有别的吗?

谢谢

c++-cli

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

在C++/CLI中跟踪所有DLL加载和初始化

我有一个复杂的C++/CLI应用程序,有许多模块(几十个),有些管理一些不受管理的模块.最近我们从Visual Studio 2013切换到Visual Studio 2015.它在某些计算机上运行,​​但在其他计算机上运行.

当程序不工作时,它甚至在主要的第一行之前崩溃.它报告了一个访问冲突异常_onexit.当忽略一些异常和断言时,我看到<Module>扔了一个TypeInitializationException.

问题是 - 我不知道哪一个.我可以看到在输出窗口中加载DLL的时间.最后加载的DLL是System.dll- 当然我的bug不存在.因此,我需要一种方法来跟踪托管DLL中的静态变量初始化,以便我可以找出哪个DLL存在问题,然后我可以跟踪有问题的初始化.

我怎样才能做到这一点?

debugging c++-cli visual-studio

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