【发布时间】:2013-10-27 18:06:13
【问题描述】:
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# 新手,请帮助我
【问题讨论】:
-
将参数声明为
ref,这样就不需要unsafe代码了。 -
@William:你能详细解释一下吗?我是 C# 新手
-
您想在此处执行的操作称为Marshaling。这是一个很大的话题,但是对于像这样的简单案例来说,它并不太难。
-
所以我说 [DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] public static extern ulong SRX_DllVersion (参考 ushort* pmajorVersion,参考 ushort* pminorVersion);但它仍然有一些错误。
-
@user2495173 我把这个例子放在一个答案中,它应该适合你。