我能否“生成”COM可见的程序集?

3
我能否生成COM可见的程序集(使用CodeDom或其他方式)?
我想将C#类公开给VBA。基本上,我有一个对象驱动的Web服务器,每次构建我的Web服务器时,我希望还生成一些包装类(使用CodeDom COM可见),因为一些客户端需要这些类来从其他上下文(如Excel / VBA等)访问数据。
所以这个可能吗?
更新: 尝试Snoopy的RegFree方法,我使用CodeDom将该类构建到test2.dll中:
   namespace Test
   { 
       public class TestClass
       {
        private double _d1;
        private double _d2;

              public double d1 {
                get { 
                  return _d1; }
                set { _d1 = value; }
              }

           public double d2 {
            get { return _d2; }
            set { _d2 = value; }
           }

           public double sum()
           {
            return d1 + d2;
           }
       }
   }

我在VBE中看到了以下内容: 在此输入图片描述

1
它只需要属性,所以没有问题。 - Hans Passant
我对COM注册方面感到困惑。我的理解是该属性不会涉及到这个问题。 - BuZz
我认为ComVisible属性是由编译器魔法处理的,所以我认为它只能与无寄存器com一起使用,但我不确定百分之百,所以请随意纠正我 :-) - NickD
2个回答

1

如果您查看ComVisibleAttribute的文档,它会说:

默认值为true,这表示托管类型对COM可见。不需要此属性即可使公共托管程序集和类型可见;它们默认情况下对COM可见。

然后有一些限制,例如仅限具有默认构造函数的公共类型等。


1
好的,那我有点困惑,因为如果我需要通过手动构建类项目将C#暴露给VBA,我需要勾选几个框。我的理解是我需要一个.tlb文件从VBA中引用。但我现在似乎无法生成它。 - BuZz
不确定你的意思。您需要注册这些类才能在VBA中可见。运行“regasm / codebase myclasses.dll”(并忽略有关未签名程序集的警告)。 - adrianm
我认为我并没有完全理解组件注册,但我猜以下问题的答案会让我清楚:这个命令是否会影响DLL,以便可以将其分发给所有客户并使用?还是它只影响我的注册表,所有客户端都需要注册它? - BuZz
VBA会在本地注册表中查找可用的COM对象。也就是说,它需要在每台运行VBA应用程序的计算机上进行注册。我认为它可以通过策略进行分发,但我还没有尝试过。 - adrianm
好的,明白了。然而,在每台机器上注册不是一个选项。 - BuZz

0

是的,使用Register Free COM可以实现。

1)打开Excel并添加以下引用

C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscoree.tlb(公共语言运行时执行引擎2.4库)

C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.tlb

将您的Code Dom生成的Classlibrary添加到存储Excel表格的同一目录中

3)使用以下VBA代码:

Sub Command1_Click()
     Dim clr As CorRuntimeHost
     Dim domain As AppDomain
     Dim objTest As Object
     Dim fltResult As String
Set clr = New CorRuntimeHost
clr.Start clr.GetDefaultDomain domain Set objTest = domain.CreateInstanceFrom("C:\Bla\YourGeneratedClassLibrary.dll", "NetComClassLibrary.Info").Unwrap fltResult = objTest.Version clr.Stop '//Debug.Print fltResult MsgBox fltResult End Sub
更多信息: http://blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx

这是我的答案:https://dev59.com/1HRB5IYBdhLWcg3w7reV - NickD
好的,看起来不错。但是我在objTest上不会得到Intellisense,似乎是这样。 - BuZz
发布你的NetComClassLibrary.Info或者你重命名的名称 :-) - NickD
我实际上没有。它应该从哪里来? - BuZz
你需要一个,否则你需要使用regasm注册你的类型。请参考链接:https://dev59.com/1HRB5IYBdhLWcg3w7reV - NickD
是的,问题是如何使用Codedom生成它。 - BuZz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接