using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace PatternSequencer
{
class Version
{
public string majorVersion;
public string minorVersion;
ushort* pmajorVersion;
ushort* pminorVersion;
ulong status;
[DllImport(@"c:\DOcuments\Myapp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")]
public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion);
public Version()
{
status = SRX_DllVersion(&pmajorVersion, &pminorVersion);
if (status)
{
majorVersion = "1 - " + *pmajorVersion;
minorVersion = "1 - " + *pminorVersion;
}
else
{
majorVersion = "0 - " + *pmajorVersion;
minorVersion = "0 - " + *pminorVersion;
}
}
}
}
它会抛出错误指针,固定大小的缓冲区只能在不安全的上下文中使用。如何将指针传递给C ++ DLL?我是C#的新手,请帮帮我
答案 0 :(得分:8)
而不是使用unsafe
上下文尝试:
[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")]
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion);
拨打电话:
ushort major, minor;
SRX_DllVersion(out major, out minor);
我假设仅输出SRX_DllVersion参数,如果没有将out
更改为ref
。
尽可能避免使用unsafe
代码。
答案 1 :(得分:3)
当然,您必须标记班级unsafe
才能使其正常运作。
unsafe class Version
{
[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")]
public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion);
}
如果您只有一种方法,则可以将方法标记为unsafe
。
并且不要忘记打开“允许不安全的代码”编译器选项。
答案 2 :(得分:1)
您必须将该方法标记为unsafe
[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")]
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion);
答案 3 :(得分:0)
尝试使用unsafe
阻止。
有关unsafe的更多信息。