C# 如何在.NET中使用类型等效功能?

C# 如何在.NET中使用类型等效功能?,c#,.net,clr,C#,.net,Clr,我试图理解.NET的类型等价特性。我在一个解决方案中创建了三个项目,两个库和一个控制台应用程序 在库中,我定义了以下类型: 类库1: namespace ClassLibrary1 { [TypeIdentifier("scope1", "identifier1")] public interface IInterface1 { } } 类库2: namespace ClassLibrary2 { [TypeIdentifier("scope1", "

我试图理解.NET的类型等价特性。我在一个解决方案中创建了三个项目,两个库和一个控制台应用程序

在库中,我定义了以下类型:

类库1:

namespace ClassLibrary1
{
    [TypeIdentifier("scope1", "identifier1")]
    public interface IInterface1
    {

    }
}
类库2:

namespace ClassLibrary2
{
    [TypeIdentifier("scope1", "identifier1")]
    public interface IInterface1
    {

    }
}
我是根据此处的文档进行此操作的:

在控制台应用程序中:

static void Main(string[] args)
{
    ClassLibrary1.IInterface1 variable1 = null;

    ClassLibrary2.IInterface1 variable2 = null;

    variable1 = variable2;
}
我发现以下编译错误:

错误CS0234命名空间“ClassLibrary2”中不存在类型或命名空间名称“IIinterface1”(是否缺少程序集引用?)

错误CS0234命名空间“ClassLibrary1”中不存在类型或命名空间名称“IInterface1”(是否缺少程序集引用?)

如果从接口定义中删除
TypeIdentifier
属性,这两个错误就会消失,但是编译器当然不会允许变量赋值,因为它们是不同的类型

我的问题是,如果我用
TypeIdentifier
属性对类型进行注释,为什么类型似乎会消失?以及如何在.NET中使用类型等价性

更新:我尝试将这些库作为DLL而不是项目引用,得到了相同的结果

更新:

我能够在.NETFramework和.NETCore3中实现类型等价

源代码可在此处找到:

因此,我目前的理解是
TypeIdentifier
属性不应该被开发人员直接使用

当项目A引用项目B时,它可以指定要“嵌入互操作类型”。此操作有一定的条件,但结果是A中使用的B中的类型被复制到编译A时生成的程序集中。编译器将使用此属性对这些类型进行注释。此功能似乎是专门为使.NET应用程序能够使用COM类型而设计的,而无需部署称为“主互操作程序集”的程序集。此PIA程序集包含与某个基于COM的库对话所需的所有元数据。如果应用程序/库只需要此库中的几个类型,它可以选择将这些类型嵌入自身中。这里需要类型等价,以便嵌入不同程序集中的不同类型可以互换使用


我找不到任何文档来解释为什么以我在本问题中描述的直接方式使用此功能无法工作。如果有人能解释一下,我将不胜感激。有没有办法让事情按照这个问题描述的方式进行?

我很好奇你为什么要这样做?这在COM时代很有用,但我已经很长时间没有看到它被使用了。@DavidG,这是我试图解决的一个问题的潜在解决方案。这里的问题太大了。基于嵌入在不同程序集中的COM接口可以互换使用的事实,我想知道我是否可以在COM之外使用此功能。如果没有您的特定用例,很难提出替代方案。通常的选择是将类放在自己的DLL中并共享,这通常会使所有这些消失。或者使用像AutoMapper这样的映射工具。当然,这在你的情况下可能没用。@DavidG,在我的情况下也没用。由于这是一个有文档记录的特性,我希望它能够工作。我想知道该功能是否在非COM场景中被故意禁用。@YacoubMassad:就COM类型而言,它是一个文档化的功能。文档中到处都提到COM类型,例如,“接口、结构、枚举和委托都支持COM类型的等效性。”鉴于所有文档中都非常强调COM,我认为期望它适用于非COM类型是不合理的。我强烈建议你寻找一个不同的解决方案,无论你最初的问题是什么。(我们无法就如何解决问题提供建议,因为我们所知道的只是你如何试图以一种无效的方式解决问题。)