gpt4 book ai didi

c# - 如何从 C# 代码调用非托管 dll 中的函数?

转载 作者:行者123 更新时间:2023-11-28 01:07:02 24 4
gpt4 key购买 nike

如何从位于 C++ dll 中的 C# 调用以下方法?如何在 C# 中重新创建以下结构?


原创

方法:

LONG MyMethod (P_HOLO_INFO pInfo, LPVOID pBuffer, LPUSHORT pTracksWritten);

结构:该方法使用以下结构:

typedef struct _HOLO_INFO
{
LONG lHoloType;
LONG lStatus;
HANDLE lThreadHandle;
LONG lErrorCode;
LONG lDriveIndex;
LONG lHeight;
SHORT iFormat;
INT iStartingTrack;
LONG lWrite;
LONG lSkip;
BOOL bSkipZero;
BOOL bInvert;
LONG lMaxConsecutiveErrors;
LONG lMaxTotalErrors;
LONG lMostConsecutiveErrors;
LONG lTotalErrors;
LPBYTE pBuffer;
LPUSHORT pTracksWritten;
LONG bUpsideDown;
} HOLO_INFO, *P_HOLO_INFO;

我在 C# 中是这样工作的

方法:

[DllImport("My.dll", EntryPoint = "_MyMethod@12")]
public unsafe static extern long MyMethod(ref HOLO_INFO pInfo, Byte[] pBuffer,ref ushort pTracksWritten);

结构:

此方法使用以下结构:

unsafe public  struct HOLO_INFO 
{
public long lHoloType;
public long lStatus;
public long lThreadHandle;
public ulong lErrorCode;
public long lDriveIndex;
public long lHeight;
public short iFormat;
public int iStartingTrack;
public long lWrite;
public long lSkip;
public bool bSkipZero;
public bool bInvert;
public long lMaxConsecutiveErrors;
public long lMaxTotalErrors;
public long lMostConsecutiveErrors;
public long lTotalErrors;
public Byte* pBuffer;
public long* pTracksWritten;
public long bUpsideDown;
};

我调用了这样的方法:

  do
{
result = MyMethod(ref pInfo,ptrBuf,pTracksWritten);
} while (result ==1 );

因为,它返回 1,如果它是 Active 0,如果成功完成 3、如果因为错误而停止。如果方法处于运行状态(Active-1)。它修改 pInfopTracksWritten 以更新状态信息。

最佳答案

很多问题:

  • LONG 应该在 C# 中声明为 int
  • HANDLE 是 IntPtr。
  • pTracksWritten 丢失。您可能需要创建一个 IntPtr 和 pBuffer,并使用 Marshal.AllocHGlobal 为它们分配内存,这取决于。
  • 您需要 [DllImport] 声明中的 CallingConvention 才能使用 Cdecl。

如果您不能调试非托管代码,那么实现它的可能性就很小。一项基本的健全性测试是确保 Marshal.SizeOf() 返回与非托管代码中的 sizeof() 相同的长度。接下来验证传递的参数在调试 native 代码时是否正常。接下来三重检查 native 代码中的指针用法并验证它们没有被复制。

关于c# - 如何从 C# 代码调用非托管 dll 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530305/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com