【问题标题】:Make a .NET Standard library COM-Visible?使 .NET 标准库 COM 可见?
【发布时间】:2018-03-02 01:08:13
【问题描述】:

对于完整的 .NET 项目,您可以勾选一个框以使项目 COM 在 Project Properties > Application tab > Assembly Information.. 中可见:

但是,.NET Standard 项目不存在Assembly Information.. 按钮,而是在Project Properties > Package tab 上输入数据,但该选项卡没有Make Assembly COM-Visible 的复选框:

您还能通过其他方法使 .NET Standard 库 COM 可见,还是出于某种原因这样做没有意义?

【问题讨论】:

  • .NET 标准是跨平台的,而 COM 是特定于平台的。您希望两者如何合作?
  • @ZdeněkJelínek 嗯,这是一个非常有趣的问题——距离我上次做 COM 已经过去了大约十年,但我认为 COM 互操作是库外部的,即它构建了一个定义COM 然后用来与库对话的接口/包装器。 IE。我认为该库仍然可以是跨平台的,但包装器将是 Windows 特定的。也许我需要为我的 .NET Standard 库编写一个完整的 .NET 库包装器……这听起来真是个坏主意!
  • 拒绝选民发表评论?我很感激对于完全理解所有这些的人来说答案可能是显而易见的,但是随着越来越多的人希望将他们的代码移至 .NET Standard 并且仍然希望使该代码可用于遗留系统,这似乎是一个问题被问过并且还没有被问过吗?
  • Microsoft 有时会忽略 Visual Studio 中的“视觉”。但不是在像这样的基本对话框中。它大喊“[ComVisible] 不标准!”相当响亮。你希望从那里去哪里?如果您不告诉我们您为什么绝对需要它,并提供一些证据证明您知道如何避开冰山和鱼雷,那么没有人可以为您提供替代方案。
  • @HansPassant 感谢您的反馈。我们在当前完整的 .NET 共享库中有通用代码。我们希望将它们转换为 .Net 标准,以便我们可以跨多个平台(EF Core、Xamarin 和完整的 .NET)使用这些库。这些库也被一些 VBA 东西通过 COM 使用,因此希望使 COM 可见性适用于这些库。我不认为 COM Visibility 对编译的库代码有很大的影响,我认为您只需要在代码中添加一些属性,然后该设置意味着在您构建时会生成一个单独的 tlb COM 包装器?

标签: .net-standard


【解决方案1】:

我在 GitHub 上评论了您的问题。只要您选择的运行时支持 .NET Standard 和 COM 可见性,您绝对可以让 .NET Standard 库 COM 可见。

以下是使用 Visual Studio 2017 和 WiX 的示例: ComVisibleNetStandard

【讨论】:

    【解决方案2】:

    @ZdeněkJelínek 在 cmets 中就该问题提出了一个有趣的观点,即 .NET Standard 应该与平台无关,而 COM 本质上是特定于平台的。

    为了测试该理论,我将the example of COM interop in the C# documentation 中的代码放入完整的 .NET 解决方案和 .NET Standard 解决方案中。这是代码:

    using System.Runtime.InteropServices;
    
    namespace project_name
    {
        [Guid("EAA4976A-45C3-4BC5-BC0B-E474F4C3C83F")]
        public interface ComClass1Interface
        {
        }
    
        [Guid("7BD20046-DF8C-44A6-8F6B-687FAA26FA71"), 
            InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
        public interface ComClass1Events 
        {
        }
    
        [Guid("0D53A3E8-E51A-49C7-944E-E72A2064F938"),
            ClassInterface(ClassInterfaceType.None),
            ComSourceInterfaces(typeof(ComClass1Events))]
        public class ComClass1 : ComClass1Interface
        {
        }
    }
    

    在完整的 .NET 中编译良好,在 .NET 标准中编译良好,但会触发此警告:

    'ComInterfaceType.InterfaceIsIDispatch' 已过时:'支持 IDispatch 可能在未来的版本中不可用。'

    所以起初这似乎证实了这一点,目前您可以添加 COM 接口,但它们不应该再按设计存在。 However, that warning shows up in the dotnet standard github repo,关于这些成员是否真的已经过时,似乎还没有一个明确的结论。

    此外,System.Runtime.InteropServices.ComVisibleAttribute 出现在 netstandard 代码库中的 this check in for a .NET Stansard 1.6 check in for the System.Runtime.Forwards.cs 类中,但我对代码库了解得不够透彻,无法知道它为何存在。因此,我已经asked the question on the .NET Standard repo 并在这里报告答案。

    【讨论】:

      猜你喜欢
      • 2013-06-09
      • 1970-01-01
      • 2011-08-31
      • 2018-08-14
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多