Tag: managed c ++

Asp.net调用C#层调用Managed C ++调用Native C ++

我的项目结构如下: ASP.NET调用C#层调用托管 C ++调用Native C ++ (我试图避免使用互操作因此这就是托管c ++层的原因)我编写unit testing来测试C#层并且它工作正常。 当我尝试运行asp.net页面时,我得到: “Could not load file or assembly…”错误。 我发现当我复制粘贴Native C ++ dll到“Temporary ASP.NET Files”(到相应的文件夹)时,该网站可以工作。 似乎Managed C ++代码只有在它位于同一个文件夹中才能找到Native C ++代码 – 显然我不能在temp文件中拥有Native dll。 有没有办法在全局范围内设置Native(不适用于System32)? 谢谢你的评论。 归结为一个选项: 这是安全问题 我用代码自己设置服务器并在cassini下运行,但是当我发布它(在iis7下运行)我得到“无法加载文件或程序集……”我正在运行IIS7 ApplicationPoolIdentity,.net 4集成非常感谢Pini。

从非托管代码加载混合模式程序集

正如标题所说,我想从非托管代码调用混合模式程序集。 更确切地说,我想动态加载混合模式程序集,然后执行一些静态非托管启动代码,为C#代码注册一些托管C ++ Wrappers。 这可能(或者我需要嵌入.Net Runtime还是使用COM?)? 有人已经这样做了,可以分享一些经验吗? PS:如果混合模式程序集包含WPF窗口,它将启动吗?

托管C ++和AnyCPU

我有一个我从C#项目引用的Managed C ++ dll。 C#项目将编译为AnyCPU。 有没有办法编译32位和64位版本的Managed C ++ dll,然后在运行时告诉C#项目加载正确的一个,具体取决于它运行的架构?

.NET在数值计算中的速度

根据我的经验,.NET比本机代码慢2到3倍。 (我实施了L-BFGS进行多变量优化)。 我已经在stackoverflow上跟踪广告到http://www.centerspace.net/products/ 速度真的很惊人,速度接近本机代码。 他们怎么能这样做? 他们说: 问:NMath是“纯粹的”.NET吗? 答:答案在某种程度上取决于您对“纯.NET”的定义。 NMath是用C#编写的,加上一个小的Managed C ++层。 但是,为了更好地执行基本线性代数运算,NMath确实依赖于原生的英特尔数学核心库(包含在NMath中)。 但是没有COM组件,没有DLL – 只是.NET程序集。 此外,在托管C ++层中分配并由本机代码使用的所有内存都是从托管堆中分配的。 有人可以向我解释一下吗?

P / Invoke和C ++ Wrappers之间的性能差异

在学习P / Invoke的过程中,我问过上一个问题: 如何在涉及指针时进行P / Invoke 但是,我不太明白在C#中使用P / Invoke而不是在托管C ++中创建包装器的含义。 在C#中使用P / Invoke创建相同的DLL肯定会导致更清晰的接口,因为我可以在嵌入式资源上使用DLLImport,但是我自己编组的本机DLL的托管C ++包装器会有更好的性能吗?

如何在没有大内存分配的情况下显示快速更新的图像?

我在超声波机器上有一个WPF应用程序,它以高达每秒30帧的速度显示用C ++生成的超声图像。 据我所知,在WPF中显示图像的正常过程是为您的图像创建一个BitmapSource,并为您的图像设置Source,然后使其无效并显示。 由于BitmapSources没有实现IDisposable,使用这种方法迫使我每秒创建30个BitmapSources。 对于具有32bppArgb格式的640×480图像,这是每秒分配大约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对象释放内存。 虽然这种方法已经工作了一段时间,但它似乎非常黑客,我发现很难相信除了通过reflection之外没有其他“适当”的方法来做到这一点。 问题:有更好的方法吗?

在C ++中使用C#类时的EEFileLoadException(win32 app)

出于部署原因,我试图使用IJW在C ++中包装C#程序集,而不是使用COM Callable Wrapper。 我已经在其他项目上完成了,但是在这个项目上,我得到了一个EEFileLoadException。 任何帮助,将不胜感激! 托管C ++包装器代码(这是在DLL中): extern “C” __declspec(dllexport) IMyObject* CreateMyObject(void) { //this class references c# in the constructor return new CMyWrapper( ); } extern “C” __declspec(dllexport) void DeleteMyObject(IMyObject* pConfigFile) { delete pConfigFile; } extern “C” __declspec(dllexport) void TestFunction(void) { ::MessageBox(NULL, _T(“My Message Box”), _T(“Test”), MB_OK); } 测试代码(这是一个EXE): typedef void* (*CreateObjectPtr)(); typedef void […]

System.IO.FileNotFoundException:在部署应用程序时无法加载文件或程序集“X”或其中一个依赖项

我在部署一个应用程序时遇到了一个奇怪的问题,该应用程序引用了一个用托管c ++编写的程序集。 我已经创建了一个程序集X,编译它并在一个名为Starter的exe文件中引用它。 Starter.exe在本地mashine上正常启动。 但是,当我将启动器调试文件夹的所有内容复制到虚拟mashine并尝试在那里启动时,它会崩溃并出现以下exception: Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly ‘X’ or one of its dependencies. The specified module could not be found. 这对我没有任何意义,因为X与Starter.exe位于同一文件夹中。 什么可能导致这个问题? UPDATE 我已经在目标机器上检查了Reflector中的依赖项,并且能够找到所有这些文件的文件。 我还为所有项目将配置更改为x86 / win32。 UPDATE 以下是Fusion Log的日志(位置:C:\ FusionLog \ Default \ Starter.exe \ X,Version = 1.0.4538.22813,Culture = neutral,PublicKeyToken = null.HTM): *** Assembly Binder Log Entry […]