我环顾四周,我需要一个适用于2个或更多C++/CLI文件的Singleton类的示例.
如何在C++/CLI中声明单例,而不是C#?
如何在两个或多个C++/CLI文件中共享该单例?
当我尝试共享该单例时,我不断获得可变重定义.
以下C#声明的等效C++/CLI语法是什么(如果存在):
interface MyInterface
{
int MyProperty {get;}
}
Run Code Online (Sandbox Code Playgroud) 今天我一直在互联网上弹跳,在阅读了很多解决方案之后,我决定写一个Chromium包装器将是一个有趣的学习经历; 更不用说我目前正在开展的几个项目是值得的.
我知道已经有一些包装在那里(awesomium,锫),更不要说一些基本的教程,像这样的,但是我看写我自己的包装.
我这样做的主要兴趣是,我能够创建和访问由WebKit生成的DOM结构,以便在C#中使用,在html依赖的任何javascript之前和之后都运行.我知道我可以使用HTMLAgilityPack和Majestic12进行HTML解析,但我希望在经过试验和测试的引擎之上构建一些快速,高效且将在可预见的未来积极开发的引擎.WebKit是一个积极开发的布局引擎,嵌入在一些最流行的浏览器中,而V8是一个令人印象深刻的javascript引擎,因此决定使用Chromium.
看到我不关心实际渲染任何内容,而是我希望访问网页的结构,我觉得整体嵌入WebKit可能有点过分.即使在我希望javascript改变DOM的情况下,我仍然没有使用渲染结果.
总结:
我真正想要的Chromium是能够创建网页的DOM,以及(可选)使用Chromium令人印象深刻的V8引擎运行所述页面脚本以进一步操纵DOM的能力.我知道这将是一项艰巨的任务,但我很想知道你要说些什么. 简而言之,是否有人与WebKit和V8(可能通过Chromium)合作,谁可以评估这种可行性并借给我他们的专业知识(通过如何处理这个问题的建议)? 我知道我最终可以确定一种合适的方式来解决这个问题,但我希望能够加快这一过程.链接或者可能是一个相对简短而又甜蜜的高级别"我就是这样做的"是我正在寻找的(也就是说我不需要任何太过花哨的东西).
我希望我所要求的不是太过分散.如果你发现它太笼统并且想要关闭这个主题,请不要这样做,请留下评论,我会尽量缩小焦点.正如我刚刚说过的那样,自从我感冒以来,我的思绪在今天蹦蹦跳跳.
我有一个本机对象(C++),它有一个gcroot指向托管对象(C#)的指针.
class SomeNativeClass {
gcroot<SomeManagedClass ^> managedClass;
};
Run Code Online (Sandbox Code Playgroud)
问题
当我在delete(someNativeClass)之前分配的本机代码中删除此类的本机实例时,managedClass实例是否会被垃圾收集,或者我是否应该显式删除它(在本机析构函数中)?
我正在尝试将C++代码移植到C#,并且大多数情况下它正在工作,但是仅用于循环的前3轮.在第四轮,输入块的字节开始不同,我不明白为什么.如果我们假设C++版本是正确的实现,为什么C#代码在第四轮给出不同的结果.下面是我的结果和代码(C++/CLR和C#的控制台应用程序)
我认为输入块在传递给AES之前在每一轮创建输入块的方式有所不同(在C++中有一种方法可以转换为基础256,to_base_256和from_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) 我使用.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++中 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++/CLI应用程序,但我希望我的C++ DLL中的大多数代码都是本机运行的(即不管理).
我在模块中只有一个CLI类,其他文件都是本机C++.
那么,确保这些本地类运行的最佳方法是什么......嗯,本机?
我是不是该:
谢谢
我有一个复杂的C++/CLI应用程序,有许多模块(几十个),有些管理一些不受管理的模块.最近我们从Visual Studio 2013切换到Visual Studio 2015.它在某些计算机上运行,但在其他计算机上运行.
当程序不工作时,它甚至在主要的第一行之前崩溃.它报告了一个访问冲突异常_onexit.当忽略一些异常和断言时,我看到<Module>扔了一个TypeInitializationException.
问题是 - 我不知道哪一个.我可以看到在输出窗口中加载DLL的时间.最后加载的DLL是System.dll- 当然我的bug不存在.因此,我需要一种方法来跟踪托管DLL中的静态变量初始化,以便我可以找出哪个DLL存在问题,然后我可以跟踪有问题的初始化.
我怎样才能做到这一点?
c++-cli ×10
c# ×3
c++ ×1
char ×1
chromium ×1
cryptography ×1
debugging ×1
dll ×1
encryption ×1
interface ×1
javascript ×1
marshalling ×1
properties ×1
singleton ×1
string ×1
unit-testing ×1
unmanaged ×1
webkit ×1