c# -从程序集中的文件夹中获取所有接口

本文关键字:获取 接口 文件夹 程序 程序集 集中 | 更新日期: 2023-09-27 17:49:53

我有一些WCF服务,我在某个文件夹内的程序集中有一个服务契约(接口)列表。我知道命名空间,它看起来像这样:

MyProject.Lib.ServiceContracts

我希望有一种方法可以抓取该文件夹中的所有文件,这样我就可以遍历每个文件并获取每个方法的属性。

以上是可能的吗?如果有,有什么建议吗?

感谢您的帮助。

c# -从程序集中的文件夹中获取所有接口

这应该可以得到所有这样的接口:

    string directory = "/";
    foreach (string file in Directory.GetFiles(directory,"*.dll"))
    {
        Assembly assembly = Assembly.LoadFile(file);
        foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))
        {
            if(ti.GetCustomAttributes(true).OfType<ServiceContractAttribute>().Any())
            {
                // ....
            }
        } 
    }

@Aliostad的答案已经发布了,但我将添加我的答案,因为我认为它更彻底…

// add usings:
          // using System.IO;
          // using System.Reflection;
          public Dictionary<string,string> FindInterfacesInDirectory(string directory)
          {
             //is directory real?
             if(!Directory.Exists(directory))
             {
                //exit if not...
                throw new DirectoryNotFoundException(directory);
             }
             // set up collection to hold file name and interface name
             Dictionary<string, string> returnValue = new Dictionary<string, string>();
             // drill into each file in the directory and extract the interfaces
             DirectoryInfo directoryInfo = new DirectoryInfo(directory);
             foreach (FileInfo fileInfo in directoryInfo.GetFiles() )
             {
                foreach (Type type in Assembly.LoadFile(fileInfo.FullName).GetTypes())
                {
                   if (type.IsInterface)
                   {
                      returnValue.Add(fileInfo.Name, type.Name);
                   }
                }
             }
             return returnValue;
          }

以上答案可能不适用于用c++/CLI创建的程序集(即具有托管/非托管代码的程序集)。

我建议替换这一行:

foreach (Type ti in assembly.GetTypes().Where(x=>x.IsInterface))
foreach (Type ti in assembly.GetExportedTypes().Where(x=>x.IsInterface))