2017-04-10 22 views
0

一類讓我們有一個簡單的類庫(ClassLibrary1的)如何使.NET反射枚舉從不主動使用

namespace ClassLibrary1 
{ 
    // a simple class 

    public class Class1 
    { 

     // some methods... 

     public void foo() { } 

     public void bar() { } 
    } 
} 

和保持對庫的引用一個簡單的控制檯應用程序:

using System; 

namespace ConsoleApplication1 
{  
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

      foreach (var assembly in assemblies) Console.WriteLine(assembly.FullName.Split(' ')[0]); 

     } 
    } 
} 

運行時,ConsoleAppliacation1輸出如下:

mscorlib, 
Microsoft.VisualStudio.HostingProcess.Utilities, 
System.Windows.Forms, 
System, 
System.Drawing, 
Microsoft.VisualStudio.HostingProcess.Utilities.Sync, 
Microsoft.VisualStudio.Debugger.Runtime, 
vshost32, 
System.Core, 
System.Xml.Linq, 
System.Data.DataSetExtensions, 
Microsoft.CSharp, 
System.Data, 
System.Net.Http, 
System.Xml, 
mscorlib.resources, 
ConsoleApplication1, 

正如你ç一看,有在組件沒有ClassLibrary1的條目......但如果我修改ConsoleApplication1看起來像這樣(請注意附加行宣佈變種X):

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // let us know about the assembly... 
      var x = new ClassLibrary1.Class1(); 

      var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

      foreach (var assembly in assemblies) Console.WriteLine(assembly.FullName.Split(' ')[0]);  
     } 
    } 
} 

那麼它確實出現(見最後一行) ...

mscorlib, 
Microsoft.VisualStudio.HostingProcess.Utilities, 
System.Windows.Forms, 
System, 
System.Drawing, 
Microsoft.VisualStudio.HostingProcess.Utilities.Sync, 
Microsoft.VisualStudio.Debugger.Runtime, 
vshost32, 
System.Core, 
System.Xml.Linq, 
System.Data.DataSetExtensions, 
Microsoft.CSharp, 
System.Data, 
System.Net.Http, 
System.Xml, 
mscorlib.resources, 
ConsoleApplication1, 
ClassLibrary1, 

這對我來說是一個問題,因爲我確實需要枚舉所有組件,甚至那些從來不直接使用,以自動填充的通過反射在ClassLibrary1的定義類的列表。

無論是我的谷歌福不工作,或者我的問題是不平凡的...

預先感謝您。

+4

你嘗試過'大會.GetReferencedAssemblies()'? –

+1

如果它們未被引用,則需要枚舉bin目錄中的程序集並手動加載它們。 – Will

+0

@將會引用該庫。或者至少...我的意思是我在控制檯應用程序項目中添加了一個項目引用。我懷疑編譯器正在優化一些東西,而不是在最終的二進制文件中包含類,除非我真的從代碼中「引用」它。這有意義嗎? – Leo128

回答

3

您需要使用Assembly.GetReferencedAssemblies()方法來代替,因爲AppDomain.CurrentDomain.GetAssemblies()只會得到當前加載過程的AppDomain的組件:

// Display information about the EXE assembly. 
Assembly a = typeof(Program).Assembly; 
foreach (AssemblyName an in a.GetReferencedAssemblies()) 
{ 

} 

詳細請見MSDN documentation here

+0

uhm ...它只是列出了mscorlib,但我仍然需要通過實例化「觸摸」Class1,以便將其輸出到輸出中。 – Leo128

+1

我回復了上面的評論,編譯器很可能會優化構建並刪除未使用的程序集引用。 –

+0

嘗試添加它的名稱空間的使用語句,看看會發生什麼 –