2011-01-09 102 views
13

我有一個簡單的任務:如何在Delphi中使用.Net程序集而不註冊到GAC或COM中?

是有可能寫出一個Delphi DLL,並把.NET程序集(用4種方法和一個類實現該接口只有一個接口),除了它並從德爾福DLL調用它?

我的意思是,如果我爲tlb創建一個tlb和一個delphi單元,而無需註冊Assembly/tlb,我可以直接從.Net程序集(相對文件名)中導入.Net類型嗎?

最好, thalm

EDIT(我發現):

大多數解決方案必須至少註冊一個DLL/TLB的COM。但我發現,最有前途的事情是: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: 它真的有用!你甚至可以控制類型編組,不可信!

+1

不錯的破解發現+1。它幾乎立即有意義,一旦記住.Net標頭只是COFF格式的擴展。我有一個偉大的文章與.Net位置的細節,但現在找不到它。這可能是更好的(而不是更簡單的)方法:http://www.codeproject.com/KB/cs/unmanagedtomanaged.aspx – user44298 2011-01-10 15:58:22

回答

5

一條小建議:您不必公開您的出口。

你的班級已經在內部了,所以當它從另一個組件中消耗時它不會顯示出來。

但是,將導出添加到現有的靜態類也是完全正確的,但將其聲明爲私有,以便在從.Net中使用時不會顯示出來。 (非託管的出口往往看起來有點令人毛骨悚然)

0

你可以使用註冊免費COM來做到這一點。查看我對免費註冊com here的問題的回答。使用.NET程序集,您需要使您的接口和方法COMVisible,就像您要使用註冊的COM使用該對象一樣。如果你就我剛纔提到的問題回答我的回答,你應該可以並排放置dll。唯一的區別是您需要將信息放入程序集清單(託管程序清單)中,以瞭解您要導出的COM類。如果您查看關於應用程序和彙編清單的Microsoft網站上的文檔,您應該瞭解如何執行此操作。您正在查找的清單屬性是CLRClass。如果你已經正確設置了所有的東西,你只需將託管dll與調用可執行文件並排放置,並且一切正常。

相關問題