Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取引用类型的全名,而不加载其程序集_C#_Reflection - Fatal编程技术网

C# 获取引用类型的全名,而不加载其程序集

C# 获取引用类型的全名,而不加载其程序集,c#,reflection,C#,Reflection,我有一个.Net项目,在这个项目中,我得到了一个程序集(*.dll),我必须列出包含的类型及其成员。然而,我没有得到大会的参考 假设给我一个A.dll,其中有一个类型: 公共类类型ina:IInterfaceInB { ... } 因为我没有得到B,所以当我尝试调用时,会得到一个FileNotFoundException typeof(TypeInA).GetInterfaces() 因为它找不到B.dll 我不需要关于IInterfaceInB的详细信息,只需要它的名称空间限定名。有没有一

我有一个.Net项目,在这个项目中,我得到了一个程序集(
*.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
不起作用?