问题标签 [unmanagedresources]

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 投票
0 回答
58 浏览

c# - 进程被杀死时有效释放非托管资源

我有多个进程(或者更确切地说是一个进程的多个实例)试图(创建或)访问单个内存映射文件。我正在使用 Mutex 来同步(第一次)创建 mmap 文件。

当所有进程第一次运行时,它运行良好并且数据被正确读取。但是,如果我通过“右键单击->关闭所有窗口”关闭所有进程(因为它们需要很长时间)并立即重新启动进程,我将面临诸如 System.IO.IOException: Pipe is broken 之类的问题。未及时清理非托管资源。我在程序结束时使用 dispose() 方法。

有没有办法解决这个问题?'using' 关键字无济于事。我应该使用 SafeHandles 吗?(我对 SafeHandles 没有经验,但已经提供了一些 SafeMemoryMappedFileHandle / SafeMemoryMappedViewHandles。)

0 投票
0 回答
149 浏览

c# - WPF ClickOnce 安装程序不包含来自 nuget 包的非托管 dll

我已经从一个包含非托管运行时特定 dll 的 netStandard2.0 项目构建并发布了一个 nuget 包。我通过将以下 ItemGroup 添加到我的 csproj 文件来做到这一点。

它为我创建了一个不错的 nuget 包,其中包含所有可能的原生 dll。


然后我在 WPF 应用程序 (net48) 中引用该包,一切都按预期工作。当我为 x64 构建项目时,只有 runtimes\win-x64\native 文件夹中的 dll 被复制到项目构建输出目录中。x86 也一样。这正是我想要的。

但是,当我将应用程序发布为 ClickOnce 时,ClickOnce 安装程序的应用程序文件文件夹中缺少非托管 dll 。

我得到的只是一个警告:MSB3331:无法为项目“vcruntime140”应用发布属性。(以 vcruntime140.dll 为例)

有没有办法让本地 dll 进入 ClickOnce 安装程序?

0 投票
1 回答
73 浏览

c# - 将“SafeHandle”用于 C API,包括引用计数

我正在研究 Python 互操作。在内部,Python 通过Py_IncRef和为所有对象保存引用计数器Py_DecRef。我想确保正确完成指向 Python 对象的指针,所以我试图创建一个PyHandle派生自的类,SafeHandle它会调用Py_DecRef.ReleaseHandle

问题是:与 Windows API 不同,Python 在返回指向对象的指针之前不会增加 refcount。所以当互操作创建一个实例时PyHandle,我希望它调用Py_IncRef指针。但是,我没有看到可以覆盖的方法。SafeHandle构造函数采用无效的句柄值,并且没有AcquireHandle覆盖。CoreCLR 代码也有不可覆盖的SetHandle方法(参见SafeHandle.cs)。

我可以做些什么来调用互操作构建的Py_IncRef时间?PyHandle

SafeHandle完成任务的正确工具吗?

0 投票
1 回答
125 浏览

c# - C# 对象不会超出范围并导致系统崩溃

我遇到了一种奇怪的情况,当我将一个对象变量重新分配给一个新实例时,最终经过多次迭代,我似乎内存不足。我得到错误:

“System.Windwos.Forms.dll”中出现“System.ComponentModel.Win32Exception”类型的未处理异常\附加信息:句柄无效

错误的控制台输出:

我曾尝试在网上查找该错误消息,并且有些人似乎认为,“您可能正在泄漏句柄,可能是由于没有正确关闭窗口或处置控件。” 但是我没有打开一个窗口,我只是在实例化一个窗口窗体的新对象实例。由于代码的性质,我无法分享它,但我可以大致了解导致错误的原因。

基本上在我的主要形式中,我TransmitMessage在这个类中创建了一个名为的类,它有一个名为的基类对象BaseSubaddress,用于保存不同类型的子类TransmitSubaddress(直接从 basesubaddress 继承)。每次我想处理一条消息时,该类使用一个函数来确定TransmitSubaddress分配哪个(1、2 或 3),每个子地址都有自己特定的例程。它将创建该对象的一个​​新实例并将其分配给 baseSubaddress 变量。

创建a 时,它会使用直接继承自此基本单词形式new transmitsubaddress的子类填充一个数组。baseWordForms当创建一个新表单时,它会调用它的InitializeComponent()函数,然后最终调用基类的InitializeComponenet()函数。

当我第 43 次尝试发送消息时,我的错误发生了。特别是在尝试填充此数组时。

有什么方法可以让我的对象不会超出范围并收集垃圾?如果是这样,我将如何强制垃圾收集或找出将其保持在范围内的引用。

我希望这个伪代码可以清楚地说明我要描述的内容。本质上,我在运行这个程序时多次调用determineDataWordand 函数。ReadMessage在初始化该窗口表单数组时,我似乎在经过这么多次之后内存不足。我尝试在不初始化该数组的情况下运行程序,并且与我定义的 43 次相比,能够成功运行 2000 多次。这让我相信这些形式的某些东西阻止了它们被垃圾回收释放。当需要实际调用这些表单时,我会使用Using关键字来尝试避免这个问题。

在创建尝试捕获结构以捕获异常时,我收到错误消息,

“System.Drawing.dll”中出现“System.outOfMemoryException”类型的未处理异常“附加信息:内存不足”