2014-06-26 45 views
4

我正在使用Robert Giesecke Unmanaged Exports創建一個.NET包裝器DLL,以在Delphi 7中使用.NET DLL。一切正常,但現在我有一個函數需要回調/代表。非託管導出和代表

這怎麼辦?

我可以給函數指針指向我的.NET DLL並從那裏調用它,當它是如何完成的?

+0

FWIW,如果你正在爲一個現有的.net DLL創建一個包裝,那麼混合模式的C++/CLI可能是一個更好的方法。它至少依賴官方支持的機制,而不是UnmanagedExports提供的魔法。並不是說我對UnmanagedExports有任何反應,因爲它確實非常出色。 –

回答

5

這很簡單。您可以像使用標準p/invoke一樣定義委託類型。

這裏是最簡單的例子,我能想到的:

C#

using RGiesecke.DllExport; 

namespace ClassLibrary1 
{ 
    public delegate int FooDelegate(); 

    public class Class1 
    { 
     [DllExport()] 
     public static int Test(FooDelegate foo) 
     { 
      return foo(); 
     } 
    } 
} 

德爾福

program Project1; 

{$APPTYPE CONSOLE} 

type 
    TFooDelegate = function: Integer; stdcall; 

function Test(foo: TFooDelegate): Integer; stdcall; external 'ClassLibrary1.dll'; 

function Func: Integer; stdcall; 
begin 
    Result := 666; 
end; 

begin 
    Writeln(Test(Func)); 
end. 

輸出

 
666 

C#端的默認調用約定是CallingConvention.Stdcall,所以我跟着那個。這是顯而易見的事情。

+0

謝謝你的回答。這確實比我用過的更容易。 –

-1

您可以:

1)使網絡DLL函數返回一個整數,它是由德爾福7 DLL消耗。不同的返回結果將觸發各種程序在Delphi 7 DLL中調用。

2)使其完全原生(從NET轉換爲Delphi 7)。

3)使其完全NET(使其完全變爲NET)。 4)如果它們都是DLL,則可以通過非託管DLL調用將本地DLL函數從Delphi導出到.NET。

+0

這確實是完全可能的。 –

+0

爲什麼選擇我的答案呢?我提出了答案。大聲笑。 - 第二個人得到-2 ... – buttercup

+0

您的回答值得讚賞,因爲它在事實上是不正確的,具有非常顯着的意義。你聲明事實上非常可能的事情是不可能的。 –

-2

找到了答案,這Call C function inside C# via function pointer幫了我很多

基本上你可以只發送指針,並調用它

在C#的一面:

  1. 定義委託的簽名

    public delegate void LinkCallback(int AValue); 
    
  2. 創建一個IntPtr Va rialbe存儲指針

    public IntPtr Callback;   
    
  3. 在DLL函數獲取指針它賦值給變量

    Callback = new IntPtr(cb); 
    
  4. 要調用回調函數,你必須封送它

    LinkCallback callback = (LinkCallback)Marshal.GetDelegateForFunctionPointer(ConList[Idx].Callback,typeof(LinkCallback)); 
    
    callback(10); 
    
+0

完全不需要'GetDelegateForFunctionPointer'。這比需要的複雜得多。 –