2012-02-13 11 views
4

他のクラスライブラリから文字列リソースをロードする方法を知りたいと思います。ここに私の構造があります。異なるクラスライブラリからのアクセス文字列リソース

Solution\ 
    CommonLibrary\ 
     EmbeddedResource.resx 
    MainGUI\ 

私はCommonLibraryのクラスの文字列を取得する場合、私はちょうどEmbeddedResource.INFO_START_MSGを使用しますが、私はタイプされた文字列リソースを使用しようとすると、これは、リソースファイルを認識することができません。 CommonLibraryは既にMainGUIで参照されていることに注意してください。

私は通常このようにします。

Solution\ 
    CommonLibrary\ 
    MainGUI\ 
     EmbeddedResource.resx 

しかし、両方のプロジェクトで同じリソースを使用したいと思います。

答えて

11

ライブラリへの参照をメインアプリケーションに追加します。リソースファイルで「アクセス修飾子」がpublicに設定されていることを確認します。

リファレンスそうのような文字列:

textBox1.Text = ClassLibrary1.Resource1.ClassLibrary1TestString; 

私は、このように「1」という名前で、右クリックを経由してリソースファイルを追加しました。クラスライブラリのプロパティページに移動し、 "リソース"タブをクリックすると、名前に数字 "1"を持たないデフォルトのリソースファイルを追加できます。

あなたの値が公開されていること、そしてメインプロジェクトに参照があることを確認しても問題はありません。

+4

具体的には、resxファイルの「カスタムツール」プロパティを「ResXFileCodeGenerator」から「PublicResXFileCodeGenerator」に変更しました。 – Nap

3

デフォルトでは、リソースクラスはinternalです。つまり、他のアセンブリでは直接使用できません。それをpublicに変更してみてください。これからの部分では、リソースクラスの文字列プロパティも作成する必要がありますpublic

2

これは過去のやり方です。ただし、アセンブリ全体では機能しない可能性があります。

public static Stream GetStream(string resourceName, Assembly containingAssembly) 
{ 
    string fullResourceName = containingAssembly.GetName().Name + "." + resourceName; 
    Stream result = containingAssembly.GetManifestResourceStream(fullResourceName); 
    if (result == null) 
    { 
     // throw not found exception 
    } 

    return result; 
} 


public static string GetString(string resourceName, Assembly containingAssembly) 
{ 
    string result = String.Empty; 
    Stream sourceStream = GetStream(resourceName, containingAssembly); 

    if (sourceStream != null) 
    { 
     using (StreamReader streamReader = new StreamReader(sourceStream)) 
     { 
      result = streamReader.ReadToEnd(); 
     } 
    } 
    if (resourceName != null) 
    { 
     return result; 
    } 
} 
+0

これはうまくいくかもしれませんが、これは厳密に型付けされたstring変数を使用すると、文字列リソース名のスペルミスまたは変更の将来の間違いを避けることができます。努力のために1つの投票をアップする。また、あなたのコードのインデントを修正しました。 – Nap

関連する問題