如何在Managed C++中编写以下C#代码
void Foo()
{
using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
Clarificaton: 对于托管对象.
我正在尝试在托管C++(.Net 2.0)中处理IDisposable对象(FileStream ^ fs)并收到错误
'Dispose' : is not a member of 'System::IO::FileStream'
Run Code Online (Sandbox Code Playgroud)
它说我应该调用析构函数.会打电话
fs->~FileStream();
Run Code Online (Sandbox Code Playgroud)
在FileStream对象上调用dispose方法?为什么我不能调用Dispose?
根据我的经验,.NET比本机代码慢2到3倍.(我实施了L-BFGS进行多变量优化).
我已经在stackoverflow上跟踪广告到 http://www.centerspace.net/products/
速度真的很惊人,速度接近原生代码.他们怎么能这样做?他们说:
问:NMath是"纯粹的".NET吗?
答:答案在某种程度上取决于您对"纯.NET"的定义.NMath是用C#编写的,加上一个小的Managed C++层.但是,为了更好地执行基本线性代数运算,NMath确实依赖于本机Intel Math Kernel Library(包含在NMath中).但是没有COM组件,没有DLL - 只是.NET程序集.此外,在托管C++层中分配并由本机代码使用的所有内存都从托管堆中分配.
有人可以向我解释一下吗?
首先,我想说清楚一点都是C++的新手,所以这可能是一个简单而且有点明显的问题.在我正在阅读的C++书中,我称之为C++ Primer,一个类是通过编写来定义的:
class classname{
public:
private:
};
Run Code Online (Sandbox Code Playgroud)
但是,在VS2008中,编译器并不喜欢这样.但是在课前添加公共引用,如:
public ref class classname{
Run Code Online (Sandbox Code Playgroud)
它在编译器中经历了.任何人都可以解释只定义类和公共ref类之间的区别是什么?我真的很感激.
我在超声波机器上有一个WPF应用程序,它以超过每秒30帧的速度显示用C++生成的超声图像.
据我所知,在WPF中显示图像的正常过程是为您的图像创建一个BitmapSource,并为您的图像设置Source,然后使其无效并显示.
由于BitmapSources没有实现IDisposable,使用这种方法迫使我每秒创建30个BitmapSources.对于具有32bppArgb格式的640x480图像,这是每秒分配大约30MB /秒的内存,然后每10秒进行一次垃圾处理,导致可见的延迟.显然不是一个可以接受的解决方案.
我目前的解决方案是:
在C++中:我在托管C++中创建一个System.Drawing.Bitmap(WinForms位图),从指针填充图片做一个memcpy,使用Graphics对象做我需要的一些额外的绘图,并将其传递给C#/ WPF在ImageReceived事件期间.
在C#中, Image.Source被设置为BitmapBuffer生成的源,这是一种访问位图源的原始数据的黑客方式:请参阅此链接.我做了一个CopyMemory的P/Invoke来将数据从Bitmap.Scan0复制到BitmapBuffer中.然后我使Image无效以更新屏幕,然后Dispose()Drawing.Bitmap对象释放内存.
虽然这种方法已经工作了一段时间,但它看起来非常糟糕,我发现很难相信没有其他"适当"的方法可以做到这一点,而不是通过反思.
问题:有更好的方法吗?
我遇到了一些像这样的MC++代码:
__gc class ClassA
{
Puclic:
ClassB GetClassB();
}
__gc class ClassB
{
Public:
int Value;
}
int main()
{
ClassA^ a = gcnew ClassA();
ClassB^ b = a->GetClassB();
int c = b->Value;
}
Run Code Online (Sandbox Code Playgroud)
在访问其值之前检查b是否为NULL不重要吗?我试过了if(b == NULL),但它不起作用.
或者它真的没有必要进行检查?但我简直不敢相信......
PS:我只想知道"参考"本身在这里是否为NULL.B类的内容是否为空并不重要.
在学习P/Invoke的过程中,我问过上一个问题:
但是,我不太明白在C#中使用P/Invoke而不是在托管C++中创建包装器的含义.在C#中使用P/Invoke创建相同的DLL肯定会导致更清晰的接口,因为我可以在嵌入式资源上使用DLLImport,但是我自己编组的本机DLL的托管C++包装器会有更好的性能吗?
如果您必须在C#和托管C++之间做出决定,您会选择哪个以及为什么?
托管C++相对于C#有什么好处?你更喜欢哪种语言?在什么情况下你会做出什么决定?
我意识到这是一个新手问题,但是当我正在努力学习C++时,我经常对这个表达式"回调"感到困惑.我用Google搜索并检查了维基百科,但没有找到一个好的探索.我熟悉一些Java和C#,但听起来不太可能,我从来没有真正理解回调意味着什么.
如果有人知道如何向一个简单的外行解释这个术语,我会非常感激.
WPF应用程序的核心是托管应用程序? 对? 因此,我必须在使用托管C++或托管C#之间进行选择.几年前我用托管C++进行过实验.它似乎还没有为黄金时段做好准备.我猜测微软在托管C#方面付出了更多努力,而不是托管C++.因此,似乎使用托管C#是两者之间的最佳选择.是这样的吗?您使用任何一种语言都可以获得WPF的经验吗?提前致谢.
managed-c++ ×10
c# ×5
.net ×4
c++-cli ×4
managed-code ×2
visual-c++ ×2
wpf ×2
c++ ×1
callback ×1
idisposable ×1
managed ×1
nmath ×1
performance ×1
pinvoke ×1