标签: unmanaged

Marshal.AllocHGlobal VS Marshal.AllocCoTaskMem,Marshal.SizeOf VS sizeof()

我有以下结构:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WAVEHDR
{
    internal IntPtr lpData;   // pointer to locked data buffer
    internal uint dwBufferLength; // length of data buffer
    internal uint dwBytesRecorded; // used for input only
    internal IntPtr dwUser;   // for client's use
    internal uint dwFlags;   // assorted flags (see defines)
    internal uint dwLoops;   // loop control counter
    internal IntPtr lpNext;  // reserved for driver
    internal IntPtr reserved;  // reserved for driver
}
Run Code Online (Sandbox Code Playgroud)

我需要分配非托管内存来存储上面结构的实例.指向此结构的指针将传递给waveOut win32 api函数(waveOutPrepareHeader,waveOutWrite,waveOutUnprepareHeader).

  1. 我应该使用Marshal.AllocHGlobal()Marshal.AllocCoTaskMem()?有什么不同?
  2. 我应该通过 …

.net c# winapi memory-management unmanaged

23
推荐指数
1
解决办法
1万
查看次数

在c#中分配"非托管"内存

我在c#中编写一个使用C++库的程序,由于某种原因,我需要分配一个非托管缓冲区来将它传递给lib.有没有办法在c#中做到这一点?基本上我只需要在C#中做一个malloc ...

谢谢

c# memory unmanaged

23
推荐指数
2
解决办法
3万
查看次数

在哪里为非托管库放置dll?

我正在尝试为依赖于ghostscript的库创建一个Nuget包,因此引用了gsdll32.dll - 一个非托管库.我不能只包括一个标准的dll参考.我在哪里把它放在nuget目录结构中?

dll dependencies unmanaged nuget

23
推荐指数
3
解决办法
9964
查看次数

如何分析windbg中的<unclassified>内存使用情况

这是在x64计算机上运行的.NET v4 Windows服务应用程序.在经过几天稳定运行后的某些时候,Windows服务内存消耗会像疯了一样飙升直到它崩溃.我能够以1.2 GB捕获它并捕获内存转储.这就是我得到的

如果我在我的转储文件上的windbg中运行!address -summary,我得到以下结果

!地址 - 简介

--- Usage Summary ------ RgnCount ------- Total Size -------- %ofBusy  %ofTotal
Free                     821      7ff`7e834000 (   7.998 Tb)           99.98%
<unclassified>           3696       0`6eece000 (   1.733 Gb)  85.67%   0.02%
Image                    1851       0`0ea6f000 ( 234.434 Mb)  11.32%   0.00%
Stack                    1881       0`03968000 (  57.406 Mb)  2.77%    0.00%
TEB                      628        0`004e8000 (   4.906 Mb)  0.24%    0.00%
NlsTables                1          0`00023000 ( 140.000 kb)  0.01%    0.00%
ActivationContextData    3          0`00006000 (  24.000 kb)  0.00%    0.00%
CsrSharedMemory          1          0`00005000 (  20.000 …
Run Code Online (Sandbox Code Playgroud)

memory debugging unmanaged windbg

22
推荐指数
2
解决办法
1万
查看次数

在"托管到原生过渡"期间究竟发生了什么?

我知道CLR需要在某些情况下进行编组,但是让我说我​​有:

using System.Runtime.InteropServices;
using System.Security;

[SuppressUnmanagedCodeSecurity]
static class Program
{
    [DllImport("kernel32.dll", SetLastError = false)]
    static extern int GetVersion();

    static void Main()
    {
        for (; ; )
            GetVersion();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我用调试器进入这个程序时,我总是看到:

鉴于没有需要完成的编组(对吗?),有人可以解释一下这种"托管到本地的过渡"中实际发生了什么,以及为什么有必要?

.net c# pinvoke unmanaged managed

22
推荐指数
3
解决办法
4846
查看次数

从非托管进程卸载.NET DLL

我正在扩展我的Inno-Setup脚本,其中包含我最好在托管DLL中的C#中实现的代码.我已经知道如何从托管DLL导出方法作为在非托管进程中使用的函数.它可以通过IL编织来完成,并且有一些工具可以实现自动化:

因此,在导出后,我可以在Inno-Setup安装程序中从Pascal脚本调用我的函数.但是有一个问题:DLL似乎不再被卸载了.使用Inno-Setup UnloadDLL(...)无效,文件将保持锁定状态,直到安装程序退出.因此,安装程序等待2秒,然后无法从临时目录(或安装目录)中删除我的DLL文件.事实上,它确实存在,直到有人清理驱动器.

我知道无法再从AppDomain卸载托管程序集,除非整个AppDomain关闭(进程退出).但是对于非托管主机进程意味着什么呢?

是否有更好的方法允许Inno-Setup在加载和使用后卸载或删除我的DLL文件?

.net c# com inno-setup unmanaged

22
推荐指数
1
解决办法
1104
查看次数

此DLL是托管还是非托管?

我在你面前拿着一个DLL.仅使用Win32 SDK,您能告诉我这个DLL是否是.NET程序集吗?

为什么?我们的应用程序以DLL的形式加载插件.我们正在尝试扩展这些插件的定义以允许.NET程序集,但接口将是不同的,因此加载器将需要知道DLL在加载之前是管理还是非管理.

.net dll assemblies unmanaged managed

18
推荐指数
3
解决办法
1万
查看次数

什么相当于C#中的WORD?

我正在尝试访问一个非托管库,很幸运能够访问API的综合指南.

不幸的是,我不知道C++的WORD类型是什么.同样,我不知道DWORD会是什么.

c# c++ unmanaged dllimport cpu-word

18
推荐指数
1
解决办法
2万
查看次数

如何将非托管IntPtr类型转换为ac#string?

我是C#的新手(来自原生C++背景),我正在尝试编写一个小UI来打印Windows广播消息等.我在我的C#程序中重写了默认的WndProc消息循环,如下所示:

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
    protected override void WndProc(ref Message m)
    {
        // Listen for operating system broadcasts.
        switch (m.Msg)
        {
            case WM_SETTINGCHANGE:

                this.richTextLog.Text += "WM_SETTINGCHANGE - lParam=" + m.LParam.ToString() + "\n";

                break;
        }
        base.WndProc(ref m);
    }
Run Code Online (Sandbox Code Playgroud)

我想知道的是,如何获取intPatr类型的lParam对象的字符串表示.它本质上是C++领域的一个空白*,我能以某种方式将它转换为C#吗?据推测,这样做本质上是不安全的.

c# unmanaged

18
推荐指数
2
解决办法
3万
查看次数

从非托管代码调用托管代码

我想从非托管C++调用我的.NET代码.我的进程入口点是基于.NET的,所以我不必担心托管CLR.我知道可以使用.NET包装器来完成.NET对象,但是我想访问托管类的各个静态方法,因此COM不是我最短/最简单的路径.

谢谢!

.net clr interop unmanaged

17
推荐指数
3
解决办法
3万
查看次数