Как определить, реализует ли эта сборка мой интерфейс без его загрузкиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как определить, реализует ли эта сборка мой интерфейс без его загрузки

Сообщение 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 (без зависимости). Общедоступный бетонный класс, чтобы считать его «достоверным».>

Подробнее здесь: https://stackoverflow.com/questions/796 ... loading-it
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»