簡體   English   中英

在C#中將具有非原始數據的對象固定

[英]pin an object with non-primitive data in c#

我有一個與計算機的通信接口,並提供了一個提供許多功能的dll。 只要我進行交流,一切都很好。 如果在5分鍾之內沒有什么可交流的,則該功能不再起作用。 我猜是因為所有這些都被垃圾收集器清理了。 經過一些研究,我可能應該將其固定在GCHandle.Alloc(object, GCHandleType.Pinned);

這是一些代碼:

物體

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public class DNCC_PARAM
{
    public int nMacNo;
    public int nOwnPort;
    public int nIpAddr;
    public int nNCPort;

    [MarshalAsAttribute(UnmanagedType.FunctionPtr)]
    public Delegate CallBackFunction;

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public short[] arrTimeout = new short[20];

    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public short[] arrRetry = new short[20];
}

一些dll導入

[DllImport(@"path to dll", CharSet = CharSet.Ansi)]
public static extern int Initialize([In()] DNCC_PARAM dncPara);

[DllImport(@"path to dll", CharSet = CharSet.Ansi)]
private static extern int dncc_Connect(int hdl);

[DllImport(@"path to dll", CharSet = CharSet.Ansi)]
private static extern int dncc_Disconnect(int hdl);

對象的實例

DNCC_PARAM param = new DNCC_PARAM();

初始化通訊

// fill the object with some data
param.nMacNo = 1;
param.nOwnPort = 7005;
param.nIpAddr = (int)IPAddress.Parse("192.168.0.10").Address;
param.nNCPort = 7005;
param.CallBackFunction = new TypeOfCallBackFunction(AppCallBack);

// init the communication
nDNCC_HANDLE = Initialize(param);

回調函數

private void AppCallBack(int iHandle, int iEvent, IntPtr arg)
{
    // doing some stuff here
}

因此,當我嘗試固定類似GCHandle.Alloc(param, GCHandleType.Pinned); 我收到一條消息,該對象不包含原始數據。 如何防止GC清除對象?

我當前的“解決方案”是一個計時器,每分鍾左右都會進行一些通信。 我工作,但是我猜這很丑。

我認為您正在尋找Marshal.StructureToPtr 此處要說明的是,您分配的托管對象沒有與您嘗試通過MarshalAs屬性描述的非托管布局相對應的內存布局。 因此,您需要Marshal類來創建確實具有所需布局的結構的非托管副本

僅當托管和非托管內存布局相同時才能使用GCHandle ,因此可以使用相同的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM