C# 在C中调用VisualBasic DLL是可行的,但如何替换Pchar?

C# 在C中调用VisualBasic DLL是可行的,但如何替换Pchar?,c#,string,pointers,pchar,C#,String,Pointers,Pchar,我有一个用VisualBasic编写的旧DLL,需要用C调用函数。 15个功能中有14个已经通过console项目进行了测试。剩下的函数有一个参数PChar,我不知道如何在C中调用它 工作函数如下所示: [DllImport("C:\\DLL\\visualbasic.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)] public static extern int command(o

我有一个用VisualBasic编写的旧DLL,需要用C调用函数。 15个功能中有14个已经通过console项目进行了测试。剩下的函数有一个参数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.输出数据:PChar 2.const pDataLen这是返回的数据长度

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

有人能告诉我如何调用这个函数吗?当我简单地使用字符串时,我会得到一个异常: 发生System.AccessViolationException类型的未处理异常。 附加信息:尝试读取或写入受保护内存。这通常表示其他内存已损坏


谢谢你的帮助。

你试过指针吗

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);
}

解决方案是使用ref字符串而不是out字符串。

Hi Ar Aui,谢谢您的回答。我更改了代码,但得到的错误消息与以前相同。这是一个非常没有帮助的片段。PChar是Delphi类型,out和const没有意义。最可能正确的参数类型是StringBuilder,没有ref或out,带有CharSet.Ansi。通话前将其容量设置为20。第二个参数肯定是int,但很难猜测它是否需要ref。我用stringbuilder尝试过。如果不使用out,则执行函数,但stringbuilder变量中没有数据。如果我在stringbuilder变量处使用out参数,那么我的错误与第一次过帐时的错误相同。public void NotWorkingout string pData,int pDataLen,out int Res{StringBuilder MyStringBuilder=new StringBuilder,20;Res=Execute\u NotWorkingMyStringBuilder,pDataLen pData=MyStringBuilder.ToString;}