Я использовал этот код, чтобы проверить, что DLL (который я создал для тестирования этого куска кода) содержит мой интерфейс. < /p>
// check if it contains the type without loading it.
using var sr = new StreamReader(assemblyPath);
using var per = new PEReader(sr.BaseStream);
var mr = per.GetMetadataReader();
foreach (var typeDefHandle in mr.TypeDefinitions)
{
var td = mr.GetTypeDefinition(typeDefHandle);
if (string.IsNullOrEmpty(mr.GetString(td.Namespace)))
continue; //if it's namespace is blank, it's not a user-defined type
if (td.Attributes.HasFlag(TypeAttributes.Interface) || td.Attributes.HasFlag(TypeAttributes.Abstract) || !td.Attributes.HasFlag(TypeAttributes.Public))
continue; //Not a public concrete type
StringBuilder sb = new();
sb.AppendLine($"Name: {mr.GetString(td.Name)}");
sb.AppendLine($"Namespace: {mr.GetString(td.Namespace)}");
sb.AppendLine($"NamespaceDefinition: {mr.GetString(td.NamespaceDefinition)}");
foreach (var ih in td.GetInterfaceImplementations())
{
var ii = mr.GetInterfaceImplementation(ih);
var it = mr.GetTypeReference((TypeReferenceHandle)ii.Interface);
sb.AppendLine($": implements {mr.GetString(it.Namespace)}.{ mr.GetString(it.Name) }");
}
tds.Add(sb.ToString());
}
< /code>
Я вижу, что выходная строка действительно содержит мой интерфейс в строке: < /p>
sb.AppendLine($": implements {mr.GetString(it.Namespace)}.{ mr.GetString(it.Name) }");
< /code>
Однако я не хочу печатать его.public static ICollection ReflectionHelper.HasInterface(string assemblyPath) {
...
var it = mr.GetTypeReference((TypeReferenceHandle)ii.Interface);
// after this line from the above code block...
// ---> how do I compare if it == MyInterface?
// ---> I'm sure it's not supposed to be something ridiculous like
// ---> (typeof(T).ToString().Equals($"{mr.GetString(it.Namespace)}.{mr.GetString(it.Name)}"))
}
< /code>
Я знаю, как проверить после загрузки сборки, но я пытаюсь заглянуть внутрь сборки и убедиться, что она внедряет определенные интерфейсы перед загрузкой их. < /p>
Структура сборки: < /p>
base (без зависимости). Общедоступный бетонный класс, чтобы считать его «достоверным».>
Подробнее здесь: https://stackoverflow.com/questions/796 ... loading-it
Как определить, реализует ли эта сборка мой интерфейс без его загрузки ⇐ C#
Место общения программистов C#
1750077902
Anonymous
Я использовал этот код, чтобы проверить, что DLL (который я создал для тестирования этого куска кода) содержит мой интерфейс. < /p>
// check if it contains the type without loading it.
using var sr = new StreamReader(assemblyPath);
using var per = new PEReader(sr.BaseStream);
var mr = per.GetMetadataReader();
foreach (var typeDefHandle in mr.TypeDefinitions)
{
var td = mr.GetTypeDefinition(typeDefHandle);
if (string.IsNullOrEmpty(mr.GetString(td.Namespace)))
continue; //if it's namespace is blank, it's not a user-defined type
if (td.Attributes.HasFlag(TypeAttributes.Interface) || td.Attributes.HasFlag(TypeAttributes.Abstract) || !td.Attributes.HasFlag(TypeAttributes.Public))
continue; //Not a public concrete type
StringBuilder sb = new();
sb.AppendLine($"Name: {mr.GetString(td.Name)}");
sb.AppendLine($"Namespace: {mr.GetString(td.Namespace)}");
sb.AppendLine($"NamespaceDefinition: {mr.GetString(td.NamespaceDefinition)}");
foreach (var ih in td.GetInterfaceImplementations())
{
var ii = mr.GetInterfaceImplementation(ih);
var it = mr.GetTypeReference((TypeReferenceHandle)ii.Interface);
sb.AppendLine($": implements {mr.GetString(it.Namespace)}.{ mr.GetString(it.Name) }");
}
tds.Add(sb.ToString());
}
< /code>
Я вижу, что выходная строка действительно содержит мой интерфейс в строке: < /p>
sb.AppendLine($": implements {mr.GetString(it.Namespace)}.{ mr.GetString(it.Name) }");
< /code>
Однако я не хочу печатать его.public static ICollection ReflectionHelper.HasInterface(string assemblyPath) {
...
var it = mr.GetTypeReference((TypeReferenceHandle)ii.Interface);
// after this line from the above code block...
// ---> how do I compare if it == MyInterface?
// ---> I'm sure it's not supposed to be something ridiculous like
// ---> (typeof(T).ToString().Equals($"{mr.GetString(it.Namespace)}.{mr.GetString(it.Name)}"))
}
< /code>
Я знаю, как проверить после загрузки сборки, но я пытаюсь заглянуть внутрь сборки и убедиться, что она внедряет определенные интерфейсы перед загрузкой их. < /p>
Структура сборки: < /p>
base (без зависимости). Общедоступный бетонный класс, чтобы считать его «достоверным».>
Подробнее здесь: [url]https://stackoverflow.com/questions/79667314/how-to-determine-if-this-assembly-implements-my-interface-without-loading-it[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия