2015-02-06 91 views
1

我有一個庫,是一個更大的應用程序的一部分。我們的自動化測試和迴歸套件是一個Ruby項目。我已經知道如何在Ruby中訪問COM可見的DLL。然而,我想要做的是在Visual Studio構建過程中同時生成COM可見二進制文件和非COM可見二進制文件。它在COM可見DLL中作爲純粹內部使用可見的內容並不重要。所有這些都可以,如果是的話,可能會是最好的。我看到我可以在AssemblyInfo.cs中設置一個值,以使所有內容都可見,但正如我所說的,我需要每一個。在構建過程中構建COM可見.NET DLL和非COM可見DLL?

有沒有辦法做到這一點,而不需要手動編寫圍繞C#項目的函數的包裝呢?

+0

'「我想不過做的是同時生成,一個COM可視化二進制文件和一個非COM可見二進制文件,在Visual Studio構建過程中「 - 澄清,您想使用_same code_生成一個COM可見文件和一個非COM可見DLL文件? – transistor1 2015-02-06 22:18:34

+0

是的,這是正確的。如果在AssemblyInfo.cs中的設置做我認爲它會做的不會創建一個COM可見的DLL?我只想要兩個版本 – Rig 2015-02-06 22:34:35

+0

沒有任何意義,[ComVisible]程序集或類只有一個屬性,就是這樣。它只有在註冊後纔會生效,CLR內置的COM interop開始執行其工作。該代碼在您的程序集中不是*,它位於mscoree.dll中。使用[ComVisible]程序集作爲普通的.NET程序集使其行爲與其他任何程序一樣,您無法區分差異。 – 2015-02-06 22:44:30

回答

2

以下是一個選項 - 將第二個項目添加到您的解決方案。

第一個項目將是一個非COM可見DLL的實現。

第二個項目會引用第一個,並且包含從第一個類派生的類(它實現了您想要公開的COM方法)。由於第一類已經實現了所有的COM暴露的界面元素,你只需要申報第二類爲實現第一個,像這樣:

namespace ClassLibrary2 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    [Guid("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB")] 
    public interface MyCOMInterface 
    { 
     void MyMethod(); 
    } 

    [ComVisible(true)] 
    [Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA")] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class Class2 : ClassLibrary1.Class1, MyCOMInterface 
    { 
     //No implementation is needed here because we're 
     //just exposing Class1's methods to COM. 
    } 
} 

通過添加第二個項目,你的解決方案可以同時生成一個構建中的DLL。

正如你所說:你可以引用一個COM公開的.NET DLL,就像其他任何東西一樣。也就是說,其他.NET項目不關心DLL的方法是否暴露給COM--它們仍然可以使用所有DLL的公共方法。使用相同的DLL,您可以將一些方法導出爲COM,並將其中的一些僅限於.NET。

我提到這一點,因爲你沒有說明這個架構背後的原因。

+0

所以,它沒有Main,因爲它不可運行,它只是一個實用程序庫,在我們測試的某些方面也會很好用。這是否意味着我將不得不爲每個需要的實現類實現一個接口? – Rig 2015-02-06 22:37:15

+0

我知道,這就是爲什麼我在引號中使用「main」這個詞。當我說你的「主」類時,我的意思是實現你的COM接口方法。 – transistor1 2015-02-06 22:38:58

+0

@Rig改變了措辭,所以希望現在對你更有意義。 – transistor1 2015-02-06 22:40:46

2

您可以爲您的項目創建額外的配置。爲此配置定義一些定義(例如COM_VISIBLE)。這可以在項目屬性 - >建設 - >定義條件編譯符號

然後,在AssemblyInfo.cs你可以使用#if指令:

#if COM_VISIBLE 
    [assembly:ComVisible(true)] 
#endif 
+0

對此,是否有避免要求我註冊DLL的方法?我的目標之一是消除必須在任何盒子上運行安裝程序。我只想將我的ruby項目中的DLL包含進來並調用它們。 – Rig 2015-02-28 20:04:53