Я пытаюсь понять функцию эквивалентности типов .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 Тип или имя пространства имен 'IInterface1' не существует в пространстве имен 'ClassLibrary1' (вам не хватает ссылки на сборку?)
Если удалить атрибут TypeIdentifier
из определений интерфейса, эти две ошибки исчезнут, но, конечно, компилятор не допустит назначения переменных, потому что это разные типы.
У меня вопрос: почему типы исчезают, если я аннотирую их атрибутом TypeIdentifier
? А как использовать эквивалентность типов в .NET?
ОБНОВЛЕНИЕ: Я пытался ссылаться на библиотеки как библиотеки DLL вместо проектов, и я получаю тот же результат.
UPDATE:
Мне удалось заставить эквивалентность типов работать как в .NET Framework, так и в .NET Core 3.
Исходный код можно найти здесь: https://github.com/ymassad/TypeEquivalenceExample
Таким образом, в настоящее время я понимаю, что атрибут TypeIdentifier
не должен использоваться разработчиками напрямую.
Когда проект A ссылается на проект B, он может указать, что он хочет "Вставить типы взаимодействия". Существуют определенные условия, чтобы это работало, но в результате типы из B, которые используются в A, копируются в сборку, созданную при компиляции A. Эти типы будут помечены этим атрибутом компилятором. Похоже, что эта функция специально разработана для того, чтобы приложения .NET могли использовать COM-типы без необходимости развертывания сборки, называемой «Primary Interop Assembly». Эта сборка PIA содержит все метаданные, необходимые для общения с определенной библиотекой на основе COM. Если приложение / библиотека требует только нескольких типов из этой библиотеки, оно может выбрать встраивание только этих типов в себя. Здесь требуется эквивалентность типов, чтобы различные типы, встроенные в разные сборки, могли использоваться взаимозаменяемо.
Я не могу найти никакой документации, объясняющей, почему использование этой функции прямым способом, который я описываю в этом вопросе, не может работать. Буду признателен, если кто-нибудь сможет пролить свет на это. Есть ли способ заставить вещи работать так, как описано в этом вопросе?