我试图了解.NET的类型等效功能。我在一个解决方案中创建了三个项目,两个库和一个控制台应用程序。
在库中,我定义了以下类型:
ClassLibrary1:
namespace ClassLibrary1
{
[TypeIdentifier("scope1", "identifier1")]
public interface IInterface1
{
}
}
ClassLibrary2:
namespace ClassLibrary2
{
[TypeIdentifier("scope1", "identifier1")]
public interface IInterface1
{
}
}
我根据此处的文档进行了此操作: https://docs.microsoft.com/en-us/dotnet/framework/interop/type-equivalence-and-embedded-interop-types
在控制台应用程序中:
static void Main(string[] args)
{
ClassLibrary1.IInterface1 variable1 = null;
ClassLibrary2.IInterface1 variable2 = null;
variable1 = variable2;
}
我收到这些编译错误:
错误CS0234类型或名称空间名称'IInterface1'在名称空间'ClassLibrary2'中不存在(您是否缺少程序集引用?)
错误CS0234在名称空间'ClassLibrary1'中不存在类型或名称空间名称'IInterface1'(您是否缺少程序集引用?)
如果从接口定义中删除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的库进行通话所需的所有元数据。如果应用程序/库仅需要该库中的几种类型,则可以选择仅将这些类型嵌入其内部。这里需要类型对等,以便嵌入在不同程序集中的不同类型可以互换使用。
我找不到任何文档解释为什么直接使用我在此问题中描述的功能无法使用。如果有人可以对此有所阐明,我将不胜感激。有没有办法使这个问题描述的方式起作用?