2016-12-05 108 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