【问题标题】:Can I "generate" COM visible assemblies?我可以“生成” COM 可见程序集吗?
【发布时间】:2012-11-16 22:11:46
【问题描述】:

我可以生成 COM 可见程序集(使用 CodeDom 或其他任何东西)吗?

我希望将 C# 类公开给 VBA。基本上,我有一个对象驱动的 Web 服务器,每次构建我的 Web 服务器时,我还想生成一些包装类(使用 CodeDom 可见的 COM),因为某些客户端需要这些来访问来自其他上下文的数据(Excel/VBA等...)。

那么这可能吗?

更新: 尝试 SnoopyRegFree 方法,我使用 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 中得到以下信息:

【问题讨论】:

  • 它只需要属性,所以没问题。
  • 我对COM注册方面感到困惑。我的理解是该属性不会处理这个问题。
  • 我假设 ComVisible 属性是由编译器魔法处理的,所以这就是为什么我认为它只适用于无注册 com,但我不是 100% 确定,所以请随时纠正我 :-)

标签: c# com


【解决方案1】:

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

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

还有一些限制,比如只有带有默认构造函数的公共类型等。

【讨论】:

  • 好吧,我有点困惑,因为如果我需要通过手动构建类项目将 C# 暴露给 VBA,我需要勾选几个框。我的理解是我需要一个 .tlb 来从 VBA 中引用。我目前似乎无法制作它
  • 不确定您的意思。您需要注册这些类以使它们对 VBA 可见。运行regasm /codebase myclasses.dll(并忽略有关未签名程序集的警告)
  • 我想我并不完全了解 com 注册,但我想对以下问题的回答会为我弄清楚:该命令是否会影响 dll,以便它可以分发给我的所有客户并使用?还是它只影响我的注册表,所有客户都需要注册它?
  • VBA 在本地注册表中查找可用的 COM 对象。即它需要在运行 VBA 应用程序的每台机器上注册。我认为它可以通过策略分发,但我没有尝试过。
  • 好吧,酷。明白这一切。但是,不能在每台机器上注册。
【解决方案2】:

是的,这可以使用免费注册 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 生成的类库添加到存储 Excel 工作表的同一目录中

3) 使用以下 VBA 代码:

子 Command1_Click() 将 clr 调暗为 CorRuntimeHost 暗域作为 AppDomain 将 objTest 调暗为对象 将 fltResult 调暗为字符串 设置 clr = 新 CorRuntimeHost clr.开始 clr.GetDefaultDomain 域 设置 objTest = domain.CreateInstanceFrom("C:\Bla\YourGeneratedClassLibrary.dll", "NetComClassLibrary.Info").Unwrap fltResult = objTest.Version clr.停止 '//调试.打印 fltResult 消息框 fltResult 结束子

更多信息: http://blogs.msdn.com/b/junfeng/archive/2006/04/20/579748.aspx

【讨论】:

  • 这完成了我的回答:stackoverflow.com/questions/465882/…
  • 好吧,看起来不错。但我不会在 objTest 上获得 Intellisense,好像
  • 发布您的 NetComClassLibrary.Info 或者您将其重命名为 :-)
  • 我其实没有。它应该来自什么/哪里?
  • 你需要一个,否则你需要使用 regasm 注册你的类型。见链接:stackoverflow.com/questions/465882/…
猜你喜欢
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多