为了账号安全,请及时绑定邮箱和手机立即绑定

是否有更简洁的方法来使 COM 可见应用程序?

是否有更简洁的方法来使 COM 可见应用程序?

C#
拉丁的传说 2021-11-07 19:15:14
给定一个特定的类:public class Klass{    public int value;    public void doSomething(){        return;    }}为了使所述类 COM 可见,据我所知,需要做几件事:进口 System.Runtime.InteropServices为类创建一个接口。扩展创建的接口。创建 2 个唯一的 GUID,一个用于接口,另一个用于类。将调度 ID 添加到接口。生产类似的东西:[Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]public interface IKlass{    [DispId(0)]    public int value;    [DispId(1)]    public void doSomething();}[Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),    ClassInterface(ClassInterfaceType.None)]public class Klass : IKlass{    public int value;    public void doSomething(){        return;    }}在我看来,生成的代码看起来非常恶心……问题是,是否有一种更简单的方法来创建这些 COM 接口?我可以想象自己修改构建过程以提供interop功能。例如public interop class Klass{    public interop int value;    //...}然而,这是非标准的,这也有它的问题。是否有任何内置到 Visual Studio/C# 的东西可以让我更容易/更清晰地构建 COM 接口?
查看完整描述

2 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

正如Zohar Peled所建议的,最好的方法是使用RegAsm.exe:


创建一些 C# 类库“TestProject”:

using System.Windows.Forms;

namespace TestProject

{

    // Note. Only public classes are exported to COM!

    public class Test

    {

        // Note. Only public methods are exported to COM!

        public void testIt() {

            MessageBox.Show("Yellow world");

        }

    }

}

重要提示:只有公共类被导出到 COM。并且只有这些类的公共方法可通过 COM 对象实例使用。


签署项目。


在 AssemblyInfo.cs 中设置[assembly: ComVisible(false)]为[assembly: ComVisible(true)]. 注意:您还可以在要向 COM 公开的每个类之前使用属性 [ComVisible(true)]。这只是将默认设置设置为true在构建 API 时更容易使用


构建项目。


运行 regasm。请记住使用正确版本的 Regasm(32 位/64 位)和适用于您的 .NET 框架的版本:


# .NET v4.5 64-bit

"C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose


# .NET v4.5 32-bit

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe" -tlb -codebase "C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.dll" -verbose


...

Regasm 应该输出如下内容:


Microsoft .NET Framework Assembly Registration Utility version 4.7.3056.0

for Microsoft .NET Framework version 4.7.3056.0

Copyright (C) Microsoft Corporation.  All rights reserved.


Types registered successfully

Type 'TestProject.Test' exported.

Assembly exported to 'C:\Users\sancarn\Desktop\tbd\TestProject\TestProject\bin\Debug\TestProject.tlb', and the type library was registered successfully

现在您可以在 VBScript 中测试该文件,例如:


Dim o As Object

Set o = CreateObject("TestProject.Test")

Call o.testIt


查看完整回答
反对 回复 2021-11-07
?
墨色风雨

TA贡献1853条经验 获得超6个赞

请注意,这会使您的项目中所有与 COM 兼容的类也对 COM 可见,而您可能不希望出现这种情况(请参阅此处和此处)。如果您没有明确设置 UUID,如果您使用 VB 或 VBA(不是 VBScript,后者是后期绑定的)等早期绑定客户端访问类,那么您在部署时就会遇到问题。


是的,它不是“干净的”,但 COM 也不是,尤其是当您想将它公开给后期绑定客户端实时 VBScript 时。


我还将您的公共字段更改为属性,这对公共成员来说更标准:


    [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]

    public interface IKlass

    {

        [DispId(0)]

        public int value {get; set;}

        [DispId(1)]

        public void doSomething();

    }


查看完整回答
反对 回复 2021-11-07
  • 2 回答
  • 0 关注
  • 198 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信