【问题标题】:Can I make only certain C# classes COM-exposed?我可以只公开某些 C# 类吗?
【发布时间】:2020-10-08 10:19:55
【问题描述】:

我有一个 C# 库项目,旨在通过 COM 从非托管 C++ 代码中使用。

只会以这种方式调用 2 或 3 个方法,但我会收到如下警告:

警告:类型库导出器警告处理''。 警告:类型库导出器在 一个签名。通用代码不能导出到 COM。

这些属性和方法不是为从 C++ 访问而设计的,事实上它们甚至不是 public 方法,因此它们(肯定)无论如何都不可见。

真的有两个问题:

  • Q1:如何控制导出的内容?类/方法或其他东西的访问修饰符?
  • Q2:如何查看导出的内容,例如检查类型库中的内容,看看我是否遗漏了什么

最好仔细检查一下我的类型库没有用大量不应该存在的东西来膨胀......

【问题讨论】:

  • 程序集应该有 ComVisible(false) 因此它是默认值,然后将 ComVisible(true) 放在要导出的“事物”(类、方法等)上。 docs.microsoft.com/en-us/dotnet/api/… 要检查 .tlb 中的内容,请使用 Windows SDK 中的 OleView
  • @SimonMourier 是上面的复选框,如果 anything 应该是 COM 可见的,仍然应该检查上面的复选框,这是控制程序集的 ComVisible 状态吗?否则我不确定我将它应用到程序集本身的什么地方。顺便说一句,这基本上就是我的问题的答案,我想,如果你愿意把它写成答案
  • “注册 COM 互操作”是关于注册 (regasm),它与暴露的内容没有严格的关系。

标签: c# .net com


【解决方案1】:

我可以将整个程序集声明为对 COM 不可见,就像这样(事实上,当您使用 Visual Studio C# 类库模板时,它应该将它自己放在 AssemblyInfo.cs 中):

// Setting ComVisible to false makes the types in this assembly not visible
// to COM components.  If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly: ComVisible(false)]

现在,在每个类中,我可以决定它是否对 COM 可见:

using System;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    [ProgId("MyCoolClass")]
    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class MyCoolVisibleClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello COM world");
        }

        // explicit non COM visible because it's set to true at class level
        [ComVisible(false)]
        public void SayHello2()
        {
            Console.WriteLine("Hello world");
        }
    }

    // implicit non COM visible
    public class MyCoolInvisibleClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello world");
        }
    }
}

您可以使用项目属性进行注册(“Register for COM Interop”复选框),但我个人使用这样的命令行注册自己(对于 64 位注册表世界):

%windir%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary1.dll /codebase /tlb

这会输出如下内容:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe ClassLibrary1.dll /codebase /tlb
Microsoft .NET Framework Assembly Registration Utility version 4.8.3752.0
for Microsoft .NET Framework version 4.8.3752.0
Copyright (C) Microsoft Corporation.  All rights reserved.

RegAsm : warning RA0000 : Registering an unsigned assembly with /codebase can cause your assembly to interfere with other applications that may be installed on the same computer. The /codebase switch is intended to be used only with signed assemblies. Please give your assembly a strong name and re-register it.
Types registered successfully
Assembly exported to 'D:\KilroyWasHere\ClassLibrary1.tlb', and the type library was registered successfully

我可以使用 OleView from Windows SDK 检查 .tlb 中的真实内容:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多