以下是一個選項 - 將第二個項目添加到您的解決方案。
第一個項目將是一個非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。
我提到這一點,因爲你沒有說明這個架構背後的原因。
'「我想不過做的是同時生成,一個COM可視化二進制文件和一個非COM可見二進制文件,在Visual Studio構建過程中「 - 澄清,您想使用_same code_生成一個COM可見文件和一個非COM可見DLL文件? – transistor1 2015-02-06 22:18:34
是的,這是正確的。如果在AssemblyInfo.cs中的設置做我認爲它會做的不會創建一個COM可見的DLL?我只想要兩個版本 – Rig 2015-02-06 22:34:35
沒有任何意義,[ComVisible]程序集或類只有一個屬性,就是這樣。它只有在註冊後纔會生效,CLR內置的COM interop開始執行其工作。該代碼在您的程序集中不是*,它位於mscoree.dll中。使用[ComVisible]程序集作爲普通的.NET程序集使其行爲與其他任何程序一樣,您無法區分差異。 – 2015-02-06 22:44:30