在构建过程中构建COM可见.NET DLL和非COM可见DLL?

时间:2015-02-06 22:05:08

标签: c# .net visual-studio com

我有一个库,它是更大的应用程序的一部分。我们的自动化测试和回归套件是一个Ruby项目。我已经知道如何在Ruby中访问COM可见的DLL。然而,我想要做的是在Visual Studio构建过程中生成COM可见二进制文件和非COM可见二进制文件。在COM可见DLL中可见的内容并不重要,因为它仅供内部使用。所有这一切都可以,如果是的话,可能会是最好的。我看到我可以在AssemblyInfo.cs中设置一个值来使所有内容都可见,但就像我说的那样,我需要其中一个。

有没有办法在没有手动编写C#项目函数的包装器的情况下执行此操作?

2 个答案:

答案 0 :(得分: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。

我提到这一点,因为你没有说明这种架构背后的原因。

答案 1 :(得分:2)

您可以为项目创建其他配置。对于此配置,定义一些定义(例如COM_VISIBLE)。这可以在项目属性 - >构建 - >条件编译符号中定义

然后,在AssemblyInfo.cs中,您可以使用#if指令:

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