如何在 Delphi 中使用 .Net 程序集而不在 GAC 或 COM 中註冊?
我有一個簡單的任務:
是否可以編寫一個 Delphi DLL 並在其旁邊放置一個 .Net 程序集(只有一個具有 4 個方法的介面和一個實現該介面的類)並從 Delphi DLL 呼叫它?
我的意思是,如果我為 tlb 創建 tlb 和 delphi 單元,而不註冊 Assembly/tlb,我可以直接從 .Net 程序集(相對文件名)導入 .Net 類型嗎?
最好的,塔姆
編輯(我發現了什麼):
大多數解決方案必須為 COM 註冊至少一個 dll/tlb。但我發現最有希望的是:來自 Robert Giesecke 的Unmanaged Exports,它是一個 Visual Studio 項目模板,可讓您編寫靜態 C#(或任何 .Net 語言)方法並從任何非託管語言呼叫它們,太棒了:
class Test { [DllExport("add", CallingConvention = CallingConvention.StdCall)] public static int Add(int left, int right) { return left + right; } }編輯2:它真的有效!你甚至可以控制類型編組,難以置信!!!
一點建議:您不必公開您的出口。
您的課程已經是內部課程,因此在從另一個程序集中使用時不會顯示。
但是,將導出添加到現有靜態類也是完全可以的,但將其聲明為私有,以便從 .Net 使用它時不會顯示。(非託管出口看起來有點令人毛骨悚然)
您可以使用免費註冊 COM 來執行此操作。在此處查看我對免費註冊 com 問題的回答。對於 .NET 程序集,您需要使您的介面和方法為 COMVisible,就好像您打算使用已註冊的 COM 來使用該對像一樣。如果您隨後按照我對剛才提到的問題的回答,您應該能夠將 dll 並排放置。唯一的區別是您需要將有關您正在導出的 COM 類的資訊放入程序集清單(託管清單)中。如果您查看 microsoft 站點上有關應用程序和程序集清單的文件,您應該了解如何執行此操作。您正在尋找的清單屬性是CLRClass. 如果您已正確設置所有內容,則只需將託管 dll 與呼叫執行檔並排放置,一切正常。