2

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).net以外のdllをロードしたい場合、例外が表示されます。

ファイルまたはアセンブリ'file:///...'またはその依存関係の1つを読み込めませんでした。モジュールには、アセンブリマニフェストが含まれていることが期待されていました。

if-else句でverifyを使用したい。手伝って頂けますか?

4

3 に答える 3

5

.NETブートストラッパーDLLには、使用できるヘルパー関数があります。Mscoree.dllは、アセンブリに必要なCLRバージョンを返すヘルパーであるGetFileVersion()をエクスポートします。ファイルがアセンブリでない場合、その関数は失敗し、例外を発生させることなく失敗します。

次のようになります。

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);
}
于 2012-09-12T18:05:49.697 に答える
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)       
     {       
       ...                      
     } 
   }
}

例外をスローせずにそれを知る最善の方法は、PE の OptionalImageFileHeader を解析し、CLR ヘッダーの DataDirectory を調べることです。

私は同じ問題を抱えていたので、現在私はそれに取り組んでいます..

于 2012-09-12T17:48:41.470 に答える
2

次のトリックを実行できます。

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

実際には、アセンブリの読み込み時にBadImageFormatExceptionを受け取ると、アセンブリが CLR アセンブリの方法でフォーマットされていないことを意味します。

Hine フォーム MSDN リンク:

ダイナミック リンク ライブラリ (DLL) または実行可能プログラムのファイル イメージが無効な場合にスローされる例外。

于 2012-09-12T17:32:48.290 に答える