我有一个库,它是更大的应用程序的一部分。我们的自动化测试和回归套件是一个Ruby项目。我已经知道如何在Ruby中访问COM可见的DLL。然而,我想要做的是在Visual Studio构建过程中生成COM可见二进制文件和非COM可见二进制文件。在COM可见DLL中可见的内容并不重要,因为它仅供内部使用。所有这一切都可以,如果是的话,可能会是最好的。我看到我可以在AssemblyInfo.cs中设置一个值来使所有内容都可见,但就像我说的那样,我需要其中一个。
有没有办法在没有手动编写C#项目函数的包装器的情况下执行此操作?
答案 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