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

Yac*_*sad 5 .net c# clr

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

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

ClassLibrary1:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

ClassLibrary2:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

我根据此处的文档进行了此操作:https : //docs.microsoft.com/zh-cn/dotnet/framework/interop/type-equivalence-and-embedded-interop-types

并在控制台应用程序中:

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

    ClassLibrary2.IInterface1 variable2 = null;

    variable1 = variable2;
}
Run Code Online (Sandbox Code Playgroud)

我收到这些编译错误:

错误CS0234类型或名称空间名称'IInterface1'在名称空间'ClassLibrary2'中不存在(您是否缺少程序集引用?)

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

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

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

更新:我试图将库引用为DLL而不是项目,并且得到相同的结果。

更新:

我能够在.NET Framework和.NET Core 3中使类型等效工作。

可以在这里找到源代码:https : //github.com/ymassad/TypeEquivalenceExample

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

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

我找不到任何文档来解释为什么以我在此问题中描述的直接方式使用此功能无法正常工作。如果有人可以对此有所阐明,我将不胜感激。有没有办法使这个问题描述的方式起作用?