Я использовал этот код, чтобы проверить, что 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#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение