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

Powerbuilder调用C#DLL(rgisecke DLL导出模板),c#,dll,powerbuilder,C#,Dll,Powerbuilder,我需要从Powerbuilder调用一个“经典”DLL C#(不是COM)。 基于以下示例在C#I中创建DLL: 我设法从Powerbuilder中调用了DLL 但是我想传递字符串“作为引用”:因此我在函数声明中添加了“ref”: [DllExport("ExpTest", CallingConvention = CallingConvention.Winapi)] [return: MarshalAs(UnmanagedType.LPWStr)] public static string E

我需要从Powerbuilder调用一个“经典”DLL C#(不是COM)。 基于以下示例在C#I中创建DLL:

我设法从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”。 当我将'ref'添加到'string sTest'声明时,它会返回一些'chinese characters')

有人能帮忙吗? 更好的是:如何将字符串数组(按ref)从Powerbuilder传递到Powerbuilder

谢谢你的帮助

理学硕士

尝试在Powerbuilder中定义如下外部函数: -函数字符串ExpTest(REF字符串值,REF long len)库“classicdl.dll”
-函数字符串ExpTest(字符串值,参考长度)库“Classicdll.dll”

-两者都有别名“ExpTest;Ansi”

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

我认为您的汉字作为字符串是对字符串对象的引用,而不是包含汉字的字符串

编辑: 看来,使用无管理的出口是一个丑陋的黑客行为。
因此,在PoweBuilder中,创建C#COM*.dll将是编写PowerBuilder扩展的更好(受支持的)方法。

。“本地外部函数”是如何实现的?嗨,爱德华多,我已经添加了我在帖子中使用的声明……嗨@user743414,谢谢你的回答。事实上,C#COM DLL更容易实现,但确实需要在注册表中注册才能从Powerbuilder调用,这就是我在这种特殊情况下需要避免的。我正在尝试创建并实现一个“无注册COM DLL”(生成清单),但目前我无法使其工作(使用Powerbuilder)(也无法)。@MSC我尝试了无管理导出示例并使其工作。检查是否已在.NET CallingConvention.StdCall和“项目属性-->生成-->x86”下选中。当您给我一个电子邮件地址时,我可以将我的.NET 4.5.2示例*.dll源代码和我的pb12.5示例应用程序源代码发送给您。您好@user743414:那太好了,非常感谢!!可以通过marc联系到我_schmidtmayer@carrefour.com