2010-12-30 10 views
1

多くの投稿に記載されているfusion.dllラッパーを実装しました。これで、更新が必要かどうかを判断するために必要なDLLがビルドとリビジョン数字。その結果、私はバージョン番号を比較することができず、Last Modifiedの日付を比較する必要があります。GACのアセンブリの最終変更日の取得

fusion.dllまたはそれのラッパーには私が推測するような方法はありませんが、どのようにしてdllの '実際の'パスを決定して最終変更日時を発見できるのですか?これまで

私のコード:私はあなたが達成しようとしているのは本当に2主なタスクがある

private DateTime getGACVersionLastModified(string DLLName) 
{ 
    FileInfo fi = new FileInfo(DLLName); 
    string dllName = fi.Name.Replace(fi.Extension, ""); 

    DateTime versionDT = new DateTime(1960,01,01); 

    IAssemblyEnum ae = AssemblyCache.CreateGACEnum(); 
    IAssemblyName an; 
    AssemblyName name; 
    while (AssemblyCache.GetNextAssembly(ae, out an) == 0) 
    { 
    try 
    { 
     name = GetAssemblyName(an); 

     if (string.Compare(name.Name, dllName, true) == 0) 
     { 
     FileInfo dllfi = new FileInfo(string.Format("{0}.dll", name.Name)); 
     if (DateTime.Compare(dllfi.LastWriteTime, versionDT) >= 0) 
      versionDT = dllfi.LastWriteTime; 
     } 
    } 
    catch (Exception ex) 
    { 
     logger.FatalException("Unable to get version number: ", ex); 
    } 
    } 
    return versionDT; 
} 
+0


を見つけていないそれは私が融合するAPIで遊ん以来、長い時間がかかりました。しかし、IAssemblyCache.QueryAssemblyInfoを代わりに呼び出してみましたか?とりわけ、ファイルパスを返すべきです。 –

答えて

1

あなたの質問に問題の説明からを見ることができます:

1)を決定し、与えられたアセンブリの場合名前はGACからロードできます。
2)指定されたアセンブリのファイル変更日を返します。

私は、これらの2つの点は、より簡単な方法で、unmanaged fusion APIで作業することなく達成できると信じています。

「System.Data」GACにあります

static void Main(string[] args) 
{ 
    // Run the method with a few test values 
    GetAssemblyDetail("System.Data"); // This should be in the GAC 
    GetAssemblyDetail("YourAssemblyName"); // This might be in the GAC 
    GetAssemblyDetail("ImaginaryAssembly"); // This just plain doesn't exist 
} 

private static DateTime? GetAssemblyDetail(string assemblyName) 
{ 
    Assembly a; 
    a = Assembly.LoadWithPartialName(assemblyName); 
    if (a != null) 
    { 
    Console.WriteLine("'{0}' is in GAC? {1}", assemblyName, a.GlobalAssemblyCache); 
    FileInfo fi = new FileInfo(a.Location); 
    Console.WriteLine("'{0}' Modified: {1}", assemblyName, fi.LastWriteTime); 
    return fi.LastWriteTime; 
    } 
    else 
    { 
    Console.WriteLine("Assembly '{0}' not found", assemblyName); 
    return null; 
    } 
} 

出力結果の例を次のようにこのタスクについて移動する簡単な方法があるかもしれませんか? True
'System.Data' Modified:10/1/2010 9:32:27 AM
'YourAssemblyName'はGACにありますか?偽
「YourAssemblyName」更新:2010年12月30日4時25分08秒AM
総会「ImaginaryAssembly」は

+0

ありがとうございます。でも、複数のバージョンはどうですか? – David

+0

GAC COM APIはドキュメント化されていません。 http://msdn.microsoft.com/en-us/library/ms404523.aspx –

+0

Mattiasのfusion APIのドキュメントを指摘してくれてありがとう。私はこれを認識しておらず、実際には文書化されていることを反映するために、回答要約を更新しました。 –

関連する問題