2011-03-02 9 views
2

SilverlightアプリケーションのProductNameをプログラムで取得することはできますか?私は、このリサイズ/ WPF命令のSilverlightの同等を探しています:SilverlightでアプリケーションのProductNameを取得する方法

string productName = System.Windows.Forms.Application.ProductName; 

はWP7のSilverlightの、[プロパティ]フォルダでWMAppManifestと呼ばれるファイルが含まれてためにどのようなデバイスあなたdevingが、

答えて

6

「エントリ」アセンブリからの呼び出しを保証できる場合のみ、次の方法を使用できます。

public static void GetProductAndVersionEasy(out string productName, out Version productVersion) 
{ 
    var callingAssembly = Assembly.GetCallingAssembly(); 

    // Get the product name from the AssemblyProductAttribute. 
    // Usually defined in AssemblyInfo.cs as: [assembly: AssemblyProduct("Hello World Product")] 
    var assemblyProductAttribute = ((AssemblyProductAttribute[])callingAssembly.GetCustomAttributes(typeof(AssemblyProductAttribute),false)).Single(); 
    productName = assemblyProductAttribute.Product; 

    // Get the product version from the assembly by using its AssemblyName. 
    productVersion = new AssemblyName(callingAssembly.FullName).Version; 
} 

(メソッドがエントリアセンブリ内にある場合は、GetCallingAssemblyをGetExecutingAssemblyに置き換えることができます)。

ハックこの情報は.xapファイルからもわかりました。メインアセンブリのバイトをメモリにロードし、製品とバージョン情報を最後の数バイトから読み込みます。私はどこでも呼び出すことができるベースライブラリ(つまり、実行アセンブリや呼び出しアセンブリではない)で再利用できるメソッドが必要だったので、これを記述しなければなりませんでした。

public static void GetProductAndVersionHack(
    out string productName, 
    out Version productVersion) 
{ 
    // Get the name of the entry assembly 
    var deployment = System.Windows.Deployment.Current; 
    var entryPointAssembly = deployment.EntryPointAssembly + ".dll"; 

    // Get the assembly stream from the xap file 
    StreamResourceInfo streamResourceInfo = Application.GetResourceStream(
    new Uri(
     entryPointAssembly, 
     UriKind.Relative)); 
    Stream stream = streamResourceInfo.Stream; 

    // The VERSION_INFO struct as at the end of the file. Just read the last 1000 bytes or so from the stream 
    // (Keep in mind that there are a lot of zeroes padded at the end of the stream. You should probably 
    // search for the real stream.Length after trimming them off) 
    stream.Position = stream.Length - 1000; 
    StreamReader streamReader = new StreamReader(stream, Encoding.Unicode); 
    string text = streamReader.ReadToEnd(); 

    // Split the string on the NULL character 
    string[] strings = text.Split(
    new[] { '\0' }, 
    System.StringSplitOptions.RemoveEmptyEntries); 

    // Get the Product Name (starts with unicode character \u0001) 
    int ixProductName = strings.FindIndexOf(line => line.EndsWith("\u0001ProductName")); 
    productName = ixProductName >= 0 ? strings[ixProductName + 1] : null; 

    // Get the Product Version 
    int ixProductVersion = strings.FindIndexOf(line => line.EndsWith("\u0001ProductVersion")); 
    productVersion = ixProductVersion >= 0 ? Version.Parse(strings[ixProductVersion + 1]) : null; 
} 

public static int FindIndexOf<T>(
    this IEnumerable<T> source, 
    Func<T, bool> match) 
{ 
    int i = -1; 
    foreach (var item in source) 
    { 
    ++i; 
    if (match(item)) return i; 
    } 
    return -1; 
} 
+0

私は、2番目のコードサンプルで、私の拡張メソッド "FindIndexOf"の1つを使用したことに気付きました。リクエストに応じてコードを共有していただければ幸いです。 – base2

0

がわからないありがとう.xmlを選択し、[デプロイメント]> [アプリケーション]の下に、「タイトル」というフィールドがあります。そこからXMLを取り出すことができますか?

私は役立つことを願っています。

+0

を試してみてはチェックして、私の解決策には、このようなファイルがありません。ありがとう –

0

AssemblyNameクラスは、Assembly FullNameプロパティの解析を提供します。

ありません、私はWP7..I'veを使用していないよ、この

string productName = (new System.Reflection.AssemblyName(this.GetType().Assembly.FullName)).Name; 
関連する問題