2016-12-05 153 views
1

我需要从Powerbuilder调用一个'经典'DLL C#(而不是COM)。 基于此示例在C#I中创建DLL: RGiesecke dll Export templatePowerbuilder调用C#DLL(RGiesecke 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”。 当我给'string sTest'声明添加'ref'时,它会返回一些'中文字符')。

任何人都可以帮忙吗? 更好:如何向Powerbuilder传递一组字符串(由ref)?

感谢您的帮助!

Msc。

试图在Powerbuilder中定义这样的外部函数: - 函数字符串ExpTest(REF字符串值,REF长LEN)LIBRARY “Classicdll.dll”
- 函数字符串ExpTest(字符串值,REF长LEN)库“Classicdll.dll”
- 以及两者都与ALIAS FOR“ExpTest; Ansi”...

+0

在PoweBuilder中。它是如何在“本地外部功能”中完成的? –

+0

嗨爱德华多,我已经添加了我在帖子中使用的声明.... – MSC

回答

1

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

我想你的中国文字是引用,作为一个字符串,该字符串对象,而不是一个字符串,它包含了中国文字。

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

+0

嗨@ user743414,谢谢你的回答。事实上,C#COM DLL更容易实现,但需要在注册表中注册才能从Powerbuilder调用,这是我在这种特殊情况下需要避免的。我试图创建并实现一个“注册免费COM DLL”(生成清单),但目前我无法使用Powerbuilder(无论是否)。 – MSC

+0

@MSC我试着unmanged出口样品,并得到它的工作。检查您是否在.NET CallingConvention.StdCall中,并在项目属性 - >编译 - > x86中选中。当您给我一个电子邮件地址时,我可以向您发送我的.NET 4.5.2示例* .dll源文件和我的pb12.5示例应用程序源文件。 – user743414

+0

Hi @ user743414:\t 这将是非常棒的赞赏!我可以通过[email protected]与他联系 – MSC