2012-09-12 39 views
2

如何驗證dll是否以.net寫入?我使用如下代碼:如何檢查dll是否爲.net庫「該模塊應包含程序集清單。」

Assembly assembly = null; 
try 
{  
    foreach (string fileName in Directory.GetFiles(Environment.CurrentDirectory.ToString(), "*.dll", SearchOption.TopDirectoryOnly)) 
    { 
    try 
    { 
     assembly = Assembly.LoadFrom(fileName); 
     Console.WriteLine(fileName); 
    } 
    catch (Exception ex) 
    { 
     ...    
    } 
    finally 
    { 
     ... 
    } 
    }    
} 
catch (ReflectionTypeLoadException ex) 
{ 
    ..    
} 

當我想要加載assembly = Assembly.LoadFrom(fileName) non-.net DLL,異常會出現:

無法加載文件或程序集「文件:/// ......「或它的一個依賴關係。 該模塊預計包含程序集清單。

我想在if-else子句中使用驗證。 你能幫我嗎?

回答

5

有中,你可以使用.NET引導程序DLL中的輔助函數。 Mscoree.dll導出GetFileVersion(),幫助程序返回程序集所需的CLR版本。當文件不是程序集時,該函數將失敗,並且不會引發異常。

它應該是這樣的:

using System; 
using System.Text; 
using System.Runtime.InteropServices; 

public class Utils { 
    public static bool IsNetAssembly(string path) { 
     var sb = new StringBuilder(256); 
     int written; 
     var hr = GetFileVersion(path, sb, sb.Capacity, out written); 
     return hr == 0; 
    } 

    [DllImport("mscoree.dll", CharSet = CharSet.Unicode)] 
    private static extern int GetFileVersion(string path, StringBuilder buffer, int buflen, out int written); 
} 
+1

是的!有用!非常感謝。 – Parado

+0

此功能在.NET Framework 4中已被棄用。http://msdn.microsoft.com/en-us/library/ms232525%28v=vs.110%29.aspx什麼應該是實際的API解決方案? – ElektroStudios

2

你可以做下面的技巧:

try { 
    Assembly assem = Assembly.LoadFile(filePath); 
} 
catch (BadImageFormatException e) { 
     //NOT .NET ASSEMBLY 
} 

在實踐中,如果上的組件負載您收到BadImageFormatException,這意味着裝配不CLR組裝方式格式化。

Hine的形式MSDN鏈接:

當動態鏈接 庫(DLL)或可執行程序的文件圖像是無效時引發的異常。

+0

是的,我能趕上一個異常如上。這對我來說並不是問題,它起作用。我想在if-else子句中使用驗證。 – Parado

+0

@Tigran你爲什麼稱它爲「詭計」?這是完全有效的,合法的和預期的方式來處理這個錯誤。 –

+0

@Palado:沒有內置的'verify'功能,也沒有我知道的。這是一條路。只需將這個調用包含在一個函數中,然後返回'false',否則返回'true'。 – Tigran

2

如果您不需要加載程序集在當前領域,我建議使用:

using System.Reflection; 

    public class AssemblyName_GetAssemblyName 
{ 
    public static void Main() 
    { 
     // Replace the string "MyAssembly.exe" with the name of an assembly, 
     // including a path if necessary. If you do not have another assembly 
     // to use, you can use whatever name you give to this assembly. 
     // 
    try  
    { 
      AssemblyName myAssemblyName = AssemblyName.GetAssemblyName("MyAssembly.exe"); 
    }  
    catch (BadImageFormatException ex)  
    {  
     ...      
    } 
    } 
} 

的最好辦法知道它,但沒有拋出一個異常,是解析OptionalImageFileHeader的PE並查看CLR Header的DataDirectory。

目前我的工作就可以了,因爲我有同樣的問題..

+0

+1它有效,但是我可以在if-else中使用漢斯的代碼。 – Parado

相關問題