C# 获取引用类型的全名,而不加载其程序集
我有一个.Net项目,在这个项目中,我得到了一个程序集(C# 获取引用类型的全名,而不加载其程序集,c#,reflection,C#,Reflection,我有一个.Net项目,在这个项目中,我得到了一个程序集(*.dll),我必须列出包含的类型及其成员。然而,我没有得到大会的参考 假设给我一个A.dll,其中有一个类型: 公共类类型ina:IInterfaceInB { ... } 因为我没有得到B,所以当我尝试调用时,会得到一个FileNotFoundException typeof(TypeInA).GetInterfaces() 因为它找不到B.dll 我不需要关于IInterfaceInB的详细信息,只需要它的名称空间限定名。有没有一
*.dll
),我必须列出包含的类型及其成员。然而,我没有得到大会的参考
假设给我一个A.dll
,其中有一个类型:
公共类类型ina:IInterfaceInB
{
...
}
因为我没有得到B,所以当我尝试调用时,会得到一个FileNotFoundException
typeof(TypeInA).GetInterfaces()
因为它找不到B.dll
我不需要关于IInterfaceInB
的详细信息,只需要它的名称空间限定名。有没有一种方法可以在不加载B.dll
的情况下获取此文件
更多上下文
我按照以下步骤加载A.dll
并枚举其类型:
var runtimeAssemblies=Directory.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(),“*.dll”);
var path=新列表(运行时程序集){path};
var resolver=新的路径组装解析程序(路径);
使用var context=newmetadataloadcontext(解析器);
var assembly=context.LoadFromAssemblyPath(路径);
由您发布的
除了要直接检查的程序集之外,此集合还应包括所有需要的依赖项。例如,要读取位于外部程序集中的自定义属性,应包含该程序集,否则将引发异常
由于您没有B.dll
,我认为在您尝试访问该程序集中的任何信息时,它会引发异常是正常的
但是,当我在.dll上使用ildasm.exe时,我可以很容易地看到实现的接口的名称。因此,至少有可能得到这些名字
有一个叫做的反编译库,我偶尔会用到它。下面是一个示例代码,您可以在不使用B.dll的情况下读取a.dll,而且还可以获取类型的实现接口全名
using System;
using System.Linq;
using dnlib.DotNet;
......
......
private static void Main(string[] args) {
// You need a module context in order to load an assembly
var moduleContext = ModuleDef.CreateModuleContext();
// This is the loaded module, please take note that it not loaded into your Domain
var loadedModule = ModuleDefMD.Load(@"A.dll", moduleContext);
var classes = loadedModule
.GetTypes() //You want types in this assembly
// I think you need classes, (structs too maybe?)
// But you do not need the Module
.Where(t=>t.IsClass && t.IsGlobalModuleType == false);
foreach (var typeDef in classes) {
Console.WriteLine($"{typeDef.FullName} implements:");
foreach (var typeDefInterface in typeDef.Interfaces) {
Console.WriteLine($" {typeDefInterface.Interface.FullName}");
}
}
Console.ReadKey();
}
你想知道橱柜里有什么,但你不想打开橱柜。你需要重新思考你的问题。如果你真的需要这样做,我不知道为什么。将其存储在元数据文件中,或解析IL
TypeInA
已经引用了IInterfaceInB
。我只想知道它的名字。参考是什么样子的?它不包含类型名吗?我有点困惑,所以您有一个引用另一个不存在的程序集的程序集,您只是试图找到程序集中不存在的类型的完全限定名?不一定是“不存在”,只是“不存在”,但是是的。typeof(TypeInA).Name
不起作用?