0

我有一个用 VisualBasic 编写的旧 DLL,需要用 C# 调用函数。15 个函数中有 14 个已经在运行(使用控制台项目测试)。剩余的函数有一个参数 PChar,我不知道如何在 C# 中调用它。

一个工作函数如下所示:

[DllImport("C:\\DLL\\visualbasic.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern int command(out UInt32 pNumber);

public void Executecommand(out UInt32 pNumber, out int Res)
{
Res = command(out pNumber);
}

不工作的函数有两个参数: 1. out pData: PChar 2. const pDataLen(这是返回的数据长度)

VB DLL 的手册说在调用函数之前保留内存并在函数完成后释放内存很重要。20 个字符应该足够了。

有人可以给我一个提示如何调用该函数吗?当我简单地使用“字符串”时,我得到一个异常:发生类型 System.AccesViolationException 的未处理异常。附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

感谢帮助。

4

2 回答 2

0

你试过指针吗?

public static extern void NotWorkFunction(out IntPtr pOut, int someConst)

void Main(string[] args)
{
  IntPtr pOut;
  int dataLength;
  string foo;

  NotWorkFunction(pOut, dataLength);
  foo = Marshal.PtrToStringAuto(pOut);
  BlockFree(pOut);
}
于 2016-09-27T08:53:07.557 回答
-1

解决方案是使用“ref string”而不是“out string”。

于 2016-09-28T12:01:01.217 回答