Powerbuilder调用C#DLL(RGiesecke dll导出模板)

时间:2016-12-05 22:16:30

标签: c# dll powerbuilder

我需要从Powerbuilder中调用一个'经典'DLL C#(而不是COM)。 基于此示例在C#I中创建DLL: RGiesecke dll Export template

我设法从Powerbuilder中调用DLL。

但我想传递字符串'作为参考':所以我在函数声明中加了'ref':

[DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)]
[return: MarshalAs(UnmanagedType.LPWStr)]
public static string ExpTest([MarshalAs(UnmanagedType.LPWStr)] ref string sText, out int length)
{
    MessageBox.Show(sText, "ExpTest");
    length = sText.Length;
    //sText = "def";
    return sText;
}

来自Powerbuilder的代码调用此函数:

String ls_arg, ls_ret
ls_arg = "abc"
long ll_len
ls_ret = ExpTest(ls_arg, ll_len)
messagebox(ls_arg, ls_ret)

当调用原始函数(没有'ref'到'string sTest'声明)时,它返回“abc”。 当我在'string sTest'声明中添加'ref'时,它会返回一些'中文字符')。

有人可以帮忙吗? 更好的是:如何将一组字符串(通过ref)传递给Powerbuilder?

感谢您的帮助!!

MSC。

尝试在Powerbuilder中定义外部函数,如下所示: - FUNCTION String ExpTest(REF String value,REF long len)LIBRARY“Classicdll.dll”
- FUNCTION String ExpTest(String value,REF long len)LIBRARY“Classicdll.dll”
- 以及ALIAS FOR“ExpTest; Ansi”......

1 个答案:

答案 0 :(得分:1)

不要使用ref。只有在想要更改对象不包含的内容时,才必须使用ref! .NET中的字符串是特殊对象。它们的作用类似于值类型,但它们是引用类型。 更多信息可以在这里找到:

我认为您的中文字符是String对象的字符串引用,而不是包含中文字符的String。

编辑: 看起来使用无人出口是一个丑陋的黑客。 因此,创建C#COM * .dll将是为PowerBuilder编写扩展的更好(支持)方式。