我正在使用Robert Giesecke Unmanaged Exports創建一個.NET包裝器DLL,以在Delphi 7中使用.NET DLL。一切正常,但現在我有一個函數需要回調/代表。非託管導出和代表
這怎麼辦?
我可以給函數指針指向我的.NET DLL並從那裏調用它,當它是如何完成的?
我正在使用Robert Giesecke Unmanaged Exports創建一個.NET包裝器DLL,以在Delphi 7中使用.NET DLL。一切正常,但現在我有一個函數需要回調/代表。非託管導出和代表
這怎麼辦?
我可以給函數指針指向我的.NET DLL並從那裏調用它,當它是如何完成的?
這很簡單。您可以像使用標準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
,所以我跟着那個。這是顯而易見的事情。
謝謝你的回答。這確實比我用過的更容易。 –
您可以:
1)使網絡DLL函數返回一個整數,它是由德爾福7 DLL消耗。不同的返回結果將觸發各種程序在Delphi 7 DLL中調用。
2)使其完全原生(從NET轉換爲Delphi 7)。
3)使其完全NET(使其完全變爲NET)。 4)如果它們都是DLL,則可以通過非託管DLL調用將本地DLL函數從Delphi導出到.NET。
這確實是完全可能的。 –
爲什麼選擇我的答案呢?我提出了答案。大聲笑。 - 第二個人得到-2 ... – buttercup
您的回答值得讚賞,因爲它在事實上是不正確的,具有非常顯着的意義。你聲明事實上非常可能的事情是不可能的。 –
找到了答案,這Call C function inside C# via function pointer幫了我很多
基本上你可以只發送指針,並調用它
在C#的一面:
定義委託的簽名
public delegate void LinkCallback(int AValue);
創建一個IntPtr Va rialbe存儲指針
public IntPtr Callback;
在DLL函數獲取指針它賦值給變量
Callback = new IntPtr(cb);
要調用回調函數,你必須封送它
LinkCallback callback = (LinkCallback)Marshal.GetDelegateForFunctionPointer(ConList[Idx].Callback,typeof(LinkCallback));
callback(10);
完全不需要'GetDelegateForFunctionPointer'。這比需要的複雜得多。 –
FWIW,如果你正在爲一個現有的.net DLL創建一個包裝,那麼混合模式的C++/CLI可能是一個更好的方法。它至少依賴官方支持的機制,而不是UnmanagedExports提供的魔法。並不是說我對UnmanagedExports有任何反應,因爲它確實非常出色。 –