0

3 つのプロジェクトのフォルダー構造は次のとおりです。

MyClassLibrary1
  Class1.cs
  Resources\
      en-GB\
          Strings.en-GB.txt
      Strings.resx
          Strings.designer.cs (auto-generated)
MyClassLibrary2 (references MyClassLibrary1)
    Class1.cs
MyAppExe (references MyClassLibrary1 and MyClassLibrary2)
    Program.cs

MyClassLibrary1 プロジェクトの下:

In Strings.resx, I've string resources defined, let's say:
    <data name="SchoolString"><value>Preschool</value></data>
In Strings.en-GB.txt, I have:
    SchoolString=Playgroup

MyClassLibrary1 のプロジェクト プロパティ -> ビルド前、次のようにしました。

CD $(ProjectDir)Resources
FOR /D %%1 IN (*) DO (
    CD "%%1"
    resgen.exe "Strings.%%1.txt"
    if %errorlevel% 0 al.exe /t:lib /culture:"%%1" /embed:"Strings.%%1.resources" /out:MyClassLibrary1.resources.dll
    if not exist "$(TargetDir)%%1" md "$(TargetDir)%%1"
    move /Y "MyClassLibrary1.resources.dll" "$(TargetDir)%%1"
    CD ..
)

MyAppExe プロジェクトの下の Program.cs:

static void Main() {
    Strings.Culture = new CultureInfo("en-GB");
    Trace.WriteLine(Strings.SchoolString);
}

問題は、ResourceManager が何らかの理由でデフォルトのリソース ファイル (MyAppExe に埋め込まれている) にフォールバックし続けることです。ここで私が間違っていることを理解するのを手伝ってください。

何を試しても得られる出力は、「Playgroup」ではなく「Preschool」です。衛星アセンブリがまったく解決されていないようです。

4

1 に答える 1

0

http://support.microsoft.com/kb/839861で提供されている正しい手順に従うと、アプリケーションは期待どおりに動作するようになりました。

私がしなければならなかったのは、次のように「ビルド前のイベントコマンドライン」を変更することだけでした:

CD "$(ProjectDir)Resources"
FOR /D %%1 IN (*) DO (
    CD "%%1"
    resgen.exe "Strings.%%1.txt" "MyClassLibrary1.Resources.Strings.%%1.resources"     if %errorlevel% == 0 (
        al.exe /t:lib /embed:"MyClassLibrary1.Resources.Strings.%%1.resources" /culture:"%%1" /out:MyClassLibrary1.resources.dll
        if not exist "$(TargetDir)%%1" md "$(TargetDir)%%1"
        move /Y "MyClassLibrary1.resources.dll" "$(TargetDir)%%1"
    )
    CD ..
)

それが誰かを助けることを願っています。

于 2013-04-03T22:39:07.573 に答える