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

给定一个特定的类:


public class Klass

{

    public int value;

    public void doSomething(){

        return;

    }

}

为了使所述类 COM 可见,据我所知,需要做几件事:

  1. 进口 System.Runtime.InteropServices

  2. 为类创建一个接口。

  3. 扩展创建的接口。

  4. 创建 2 个唯一的 GUID,一个用于接口,另一个用于类。

  5. 将调度 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 接口?


拉丁的传说
浏览 199回答 2
2回答

狐的传说

正如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.0for Microsoft .NET Framework version 4.7.3056.0Copyright (C) Microsoft Corporation.  All rights reserved.Types registered successfullyType '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 ObjectSet o = CreateObject("TestProject.Test")Call o.testIt

墨色风雨

请注意,这会使您的项目中所有与 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();    }
打开App,查看更多内容
随时随地看视频慕课网APP