问题标签 [unmanaged]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7273 浏览

c# - 使用不使用 Graphics.DrawImage 将一个位图复制到一个更大的位图上

这是从多个线程渲染到单个位图对象的后续内容

我试图实现的是使用位图 LockBits 函数或任何其他但不是 graphics.DrawImage 的位图,将其绘制到更大图像上任何点的 50x50 像素位图并绘制到更大的位图(100x100 像素)上。我不想使用 DrawImage 的原因在另一个线程中说明。

我已经设法通过使用 Marshal.Copy 从源 BitmapData 到 dest BitmapData 得到一些东西,但它创建了一个平铺的水平拉伸图像。

0 投票
5 回答
67090 浏览

c# - 将非托管 dll 嵌入托管 C# dll

我有一个使用 DLLImport 使用非托管 C++ dll 的托管 C# dll。一切都很好。但是,我想将该非托管 DLL 嵌入到我的托管 DLL 中,正如 Microsoft 在那里解释的那样:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

所以我将非托管 dll 文件添加到我的托管 dll 项目中,将属性设置为“嵌入式资源”并将 DLLImport 修改为:

其中“Wrapper Engine”是我的托管 DLL 的程序集名称“Unmanaged Driver.dll”是非托管 DLL

当我跑步时,我得到:

访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我从 MSDN 和http://blogs.msdn.com/suzcook/看到这应该是可能的......

0 投票
3 回答
1720 浏览

c++ - 如何在 .NET 中使用托管 DLL 中的非托管类?

我有一个非托管类,我试图从托管DLL 文件中进行 dllexport。我正在尝试在另一个托管DLL 文件中使用非托管类。但是,当我尝试这样做时,会出现链接错误。

我已经用非托管 DLL 文件做了很多次,所以我知道它是如何工作的。我知道如何在托管类中使用“公共参考”等。

我需要在某个地方设置一些标志吗?还是我必须做一些 DllImport 魔术?

这是在 .NET 2.0 和Visual Studio 2005上。

0 投票
3 回答
2365 浏览

.net - 使用不安全代码有什么影响

除了代码本身可以直接访问内存之外。使用“/unsafe”编译器标志和“fixed”关键字的其他含义是什么?是否有与我的 .exe 的代码签名和部署相关的影响(我的应用程序仅适用于桌面)?

(这不是关于我是否应该这样做,为什么我的问题在这里

0 投票
3 回答
5927 浏览

c# - 如何从 C# ASP.NET 网页调用非托管 C/C++ 代码

我有一个使用 C# 的 ASP.NET 网站,我想从非托管 C/C++ DLL 调用函数。我该怎么做?

0 投票
4 回答
3481 浏览

c# - 在传递给非托管代码之前将委托固定在结构中

我正在尝试使用非托管 C dll 将图像数据加载到 C# 应用程序中。该库有一个相当简单的接口,您可以在其中传入一个包含三个回调的结构,一个接收图像的大小,一个接收每一行像素,最后一个在加载完成时调用。像这样(C# 托管定义):

以 st_ImageProtocol 开头的类型是委托:

对于我正在使用的测试文件,SetSize 应该被调用一次,然后 SendLine 将被调用 200 次(图像中的每一行像素一次),最后触发了 Done 回调。实际发生的是 SendLine 被调用 19 次,然后抛出 AccessViolationException 声称库试图访问受保护的内存。

我可以访问 C 库的代码(尽管我无法更改功能),并且在它调用 SendLine 方法的循环期间它不会分配或释放任何新内存,所以我的假设是委托本身是问题,我需要在传递它之前将其固定(我目前在委托本身内没有代码,除了一个计数器来查看它被调用的频率,所以我怀疑我在托管方面破坏了任何东西)。问题是我不知道该怎么做;我一直用来在非托管空间中声明结构的方法不适用于委托 (Marshal.AllocHGlobal()),而且我找不到任何其他合适的方法。代表本身是 Program 类中的静态字段,因此它们不应该被垃圾收集,但我猜运行时可能会移动它们。

Chris Brumme 的这篇博客文章说,委托在传递到非托管代码之前不需要固定:

显然,非托管函数指针必须指向一个固定地址。如果 GC 重新定位它,那将是一场灾难!这导致许多应用程序为委托创建固定句柄。这是完全没有必要的。非托管函数指针实际上是指我们动态生成以执行转换和封送处理的本机代码存根。此存根存在于 GC 堆外的固定内存中。

但是我不知道当委托是结构的一部分时这是否成立。这确实意味着可以手动固定它们,我对如何执行此操作或关于为什么循环运行 19 次然后突然失败的任何更好建议感兴趣。

谢谢。


编辑回答约翰的问题......

分配结构体的代码如下:

其中 _sendLineFunc 和 _imageProtocol 变量都是 Program 类的静态字段。如果我正确理解了它的内部结构,这意味着我将一个指向_imageProtocol 变量副本的非托管指针传递到 C 库中,但该副本包含对静态 _sendLineFunc 的引用。这应该意味着 GC 不会触及副本 - 因为它是非托管的 - 并且委托不会被收集,因为它仍在范围内(静态)。

该结构实际​​上作为另一个回调的返回值传递给库,但作为指针:

基本上还有另一种结构类型,它保存图像文件名和指向此回调的函数指针,库确定文件中存储的图像类型,并使用此回调为给定类型请求正确的协议结构。我的文件名结构的声明和管理方式与上面的协议相同,因此可能包含相同的错误,但由于此委托只被调用一次并且调用速度很快,所以我还没有遇到任何问题。


编辑更新

感谢大家的回复,但在又花了几天时间解决这个问题但没有任何进展后,我决定搁置它。万一有人感兴趣,我正在尝试为 Lightwave 3D 渲染应用程序的用户编写一个工具,一个不错的功能是能够查看 Lightwave 支持的所有不同图像格式(其中一些是相当奇特的)。我认为最好的方法是为 Lightwave 用于图像处理的插件架构编写一个 C# 包装器,这样我就可以使用他们的代码来实际加载文件。不幸的是,在针对我的解决方案尝试了一些插件之后,我遇到了各种我无法理解或修复的错误,我的猜测是 Lightwave 没有以标准方式调用插件上的方法,可能是为了提高运行外部代码的安全性(我承认在黑暗中野蛮刺伤)。暂时我将放弃图像功能,如果我决定恢复它,我会以不同的方式处理它。

再次感谢,即使我没有得到我想要的结果,我也通过这个过程学到了很多东西。

0 投票
2 回答
18441 浏览

c# - 如何将 IntPtr 转换回对象

所有,这是对上一个问题的跟进:C#formatting external Dll function parameters

这里特别是我试图转换为 C# 的代码:

函数“FILES_GetMemoryMapping”被调用了两次,我猜第一次是获取结构的大小,第二次是实际填充它。

“pMapping”是指向 C++ 中结构的指针,在我的 C# 代码中,我将 pMapping 作为 IntPtr 类型。下一行我可以转换为:

以 (UM0516.Mapping) 为结构。很酷,所以我刚刚分配了一些 IntPtr 指向的空间。现在是下一行...“pMapping->NbSectors = 0;”

我应该如何进入现在分配的非托管内存空间,将其类型转换为 (UM0516.Mapping) 结构,并设置其成员之一?然后确保我没有搞砸太多,这样我第二次调用“FILES_GetMemoryMapping”时,它现在可以使用这个结构了吗?

-- 好的,我接受了一些建议,现在有了这个:

我试过了,在第一次“FILES_GetMemoryMapping”调用时出现“AccessViolationException 未处理”异常

这是我所拥有的:

你认为这个异常来自“pMapping”参数吗?这可能来自我传递的其他任何东西吗?

0 投票
2 回答
6042 浏览

c++ - 如何将结构的 C++/CLI 数组编组为非托管 C++

我正在寻找将结构数组传递给非托管 C++ dll 的正确语法。

我的 dll 导入是这样调用的

在我的客户代码中,我有

我知道 System::Runtime::InteropServices::Marshal 有很多有用的方法来做这样的事情,但我不确定该使用哪个。

0 投票
5 回答
7827 浏览

dll - 调用非托管 DLL 时 vshost32.exe 崩溃

我正在使用 VS 2005 应用程序与非托管 (Fortran) DLL 进行交互。当我直接从命令行运行编译后的可执行文件时,一切都很好——可以访问 DLL,并且可以使用 DLL 中的函数。

不幸的是,当我从 VS 2005 启动应用程序时,我收到一个弹出窗口,指出“vshost32.exe 已停止工作”并且没有有用的调试信息。

有没有人经历过这种行为,或者知道为什么会发生这种情况?我不明白为什么它在独立启动时运行良好,但不是通过 vshost32。

(最后一点:我正在使用 .local 文件强制从 cwd 使用已注册的 dll,但这个特定的 dll 未注册。我只是在此处注明,以防万一。)


非常感谢,

麦克风

0 投票
3 回答
2972 浏览

user-interface - C ++中托管和非托管类型之间的转换?

我认为,当我在 C++ 中使用 GUI 时,文本字段存储为托管字符串。我需要一种将它们转换为标准整数、浮点数和字符串的方法。有什么帮助吗?