2011-05-30 108 views
6

我用單一方法編寫.Net 3.5 dll,這個方法將由Delphi .exe調用。 不幸的是它不起作用。從Delphi調用C#dll

步驟: 1.創建C#3.5 DLL的代碼:

public class MyDllClass 
{ 
    public static int MyDllMethod(int i) 
    { 
     MessageBox.Show("The number is " + i.ToString()); 
    } 
} 
  1. 轉到大會屬性 - >大會信息,並檢查了 「請大會COM可見」
  2. 使用RegAsm.exe註冊我的dll

這引發Delphi異常,表明它不能連接dll。 啓用從非託管代碼使用C#託管dll所需的步驟是什麼?

有沒有人熟悉關於該主題的好例子?

謝謝

+0

到底是如何你想連接的對象?您是使用嚮導(它爲您生成一個包裝單元)導入它還是直接加載庫? – 2011-05-30 12:51:20

+0

我發現了這些問題的解決方案 - 請參閱下面的回答 – 2011-06-22 07:43:43

回答

7

經過大量調查後,我發現解決方案:它全部是關於註冊參數。 標誌/代碼庫必須添加到regasm命令中。

許多帖子都建議在C#Com公開的對象上使用Guid和其他COM屬性,我設法使用ComVisible(true)屬性和regasm/tlb/codebse命令來提供COM功能。

代碼:

[Guid("7DEE7A79-C1C6-41E0-9989-582D97E0D9F2")] 
[ComVisible(true)] 
public class ServicesTester 
{ 
    public ServicesTester() 
    { 
    } 

    //[ComVisible(true)] 
    public void TestMethod() 
    { 
     MessageBox.Show("You are in TestMEthod Function"); 
    } 
} 

,正如我提到我用regasm.exe/TLB /代碼庫進行註冊

-7

您應該詳細瞭解您正在使用的工具。您嘗試使用另一個(不是很簡單)的技術連接兩個完全不同的世界(.Net,Delphi):COM。你的問題很清楚地表明你沒有很好地理解COM,可能不是.Net。沒有一個簡單的例子可以解決你的使用案例。你必須學習COM,而不是必須學習如何使.Net代碼可用於COM,然後你必須學習如何從Delphi調用COM對象。這已經是捷徑。沒有更多快捷方式可用!

+13

我認爲發佈教學答案的效率並不高,比如小學老師手上拿着(象徵性)巴掌,因爲您一直很頑皮。我沒有看到原始問題有任何問題。他可以犯錯誤,犯錯誤,犯錯誤,向他們學習,然後繼續前進。 – costa 2014-01-15 23:51:17

2

有一件事情,如果你讓你的程序集x64或AnyCPU可能是一個問題。由於Delphi是32位(x86),因此您需要組裝x86或確保regasm.exe將其註冊到32位註冊表中。您可以通過使用regasm.exe的x86版本來完成此操作。

29

您可以通過我的project template for unmanaged exports

class MyDllClass 
{ 
    [DllExport] 
    static int MyDllMethod(int i) 
    { 
     MessageBox.Show("The number is " + i.ToString()); 
     return i + 2; 
    } 
} 

在Delphi中,你會導入它像這樣有更多的運氣跳過COM部分:

function MyDllMethod(i : Integer) : Integer; stdcall; extern 'YourAssembly.dll'; 

我不得不向下投你的問題,雖然。甚至不關心提供可編譯的代碼。 (你的C#方法不會返回一個值,但它期望爲int)

+0

嗨,羅伯特,在將zip文件放在適當的位置後(My Documents \ Visual Studio 20 ** \ Templates \ ProjectTemplates),我看不到該模板。我正在使用VS2010,你熟悉它嗎? – 2011-06-01 06:28:39

+0

您確實下載了UnmanagedExportLibrary.zip,對吧?包含示例的頁面鏈接到DllExport.zip,它只是構建任務和一些庫,而不是模板。如果您確實使用了該模板:請轉至工具/選項/項目和解決方案。在那裏您會找到屬性「用戶項目模板位置」。這是VS將在其中搜索項目模板的文件夾。 – 2011-06-01 07:38:00