日期:2014-05-17  浏览次数:20957 次

在代码里面写"[ComVisible(true)]",和在工程属性里设置com可见,这两个有什么区别吗?
我自己的代码里面如果不写[ComVisible(true)]这样的语句,而只在工程属性里面选择com可见(如下图),编译出来的dll也是可以被vc写的com客户端调用的。

namespace cs_ClassLibrary1
{
    [Guid("154BD6A6-5AB8-4d7d-A343-0A68AB79470B")]
    public interface MyCom_Interface
    {
        [DispId(1)]
        int Add(int a, int b);
    }
    /*
    [Guid("D11FEA37-AC57-4d39-9522-E49C4F9826BB"),
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface MyCom_Events
    {
    }
    */
    [Guid("2E3C7BAD-1051-4622-9C4C-215182C6BF58"),
      ClassInterface(ClassInterfaceType.None)/*,
      ComSourceInterfaces(typeof(MyCom_Events))*/
    ]
    public class Class1 : MyCom_Interface
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
    }
}



问题是: 什么时候才需要显示的声明[ComVisible(true)]呢?我这里看到好像工程属性里面设置了,代码就不需要了啊?

还请高手指点!

------解决方案--------------------
实际上会在Properties节点下的AssemblyInfo.cs下添加[assembly: ComVisible(true)]
------解决方案--------------------
前者提供更精细的粒度,如果有些类型你不想公开的话。
------解决方案--------------------
在工程属性里设置的是全局的,表名该程序集的所有类都会COM可见(除非另外设置了[ComVisible(false)]。而在类的定义上加[ComVisible(true)],则代表这个类是COM可见的,不管工程属性有无设置COM可见性。