アセンブリを作成し、後で名前を変更しました。
次に、呼び出し時にランタイムエラーが発生し始めました。
toolsMenuName = resourceManager.GetString(resourceName);
resourceName
変数は、実行時"enTools"です。
指定されたカルチャまたはニュートラルカルチャに適したリソースが見つかりませんでした。 「Jfc.TFSAddIn.CommandBar.resources」がコンパイル時にアセンブリ「Jfc.TFSAddIn」に正しく埋め込まれている、またはリンクされていること、または必要なすべてのサテライトアセンブリがロード可能で完全に署名されていることを確認してください。
コード:
string resourceName;
ResourceManager resourceManager = new ResourceManager("Jfc.TFSAddIn.CommandBar", Assembly.GetExecutingAssembly());
CultureInfo cultureInfo = new CultureInfo(_applicationObject.LocaleID);
if(cultureInfo.TwoLetterISOLanguageName == "zh")
{
CultureInfo parentCultureInfo = cultureInfo.Parent;
resourceName = String.Concat(parentCultureInfo.Name, "Tools");
}
else
{
resourceName = String.Concat(cultureInfo.TwoLetterISOLanguageName, "Tools");
}
toolsMenuName = resourceManager.GetString(resourceName); // EXCEPTION IS HERE
プロジェクトに含まれているCommandBar.resxファイルを確認できます。ファイルを開いて、そこに "enTools"文字列を表示できます。リソースがアセンブリに含まれていないか、リソースが含まれているようですが、.NETは名前を解決できません。
より簡単な解決策は、言語ごとに個別のリソースファイルを作成することだと思います。
このケースに関する限り、リソースを含むアセンブリのデフォルトの名前空間が同じテキストに設定されているかどうかを確認します(プロジェクト->プロパティ->デフォルトの名前空間、VSの場合)。
ResxファイルのプロパティBuildActionが「Embedded resource」に設定されているかどうかも確認してください
私たちが抱えていた問題に似た音。リソースファイルのデザイナーで名前空間が正しくありませんでした。 resxファイルでカスタムツールを手動で再実行して修正しました。
Your.resxを右クリックし、[カスタムツールの実行]をクリックします。
すでに答えはわかっていると思いますが、念のために:
次の呼び出しにより、ManifestResourceNameを表示できます
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
マニフェスト名とGetString()呼び出しでの名前が同じであることを確認してください。
また、designer.resxファイルに正しい名前空間があることを確認してください:
namespace Jfc.TFSAddIn {
...
global::System.Resources.ResourceManager temp =
new global::System.Resources.ResourceManager(
"Jfc.TFSAddIn.CommandBar", typeof(CommandBar).Assembly);
...
}
Resxファイルのプロパティを開く:「ビルドアクション」は「埋め込みリソース」である必要があります
私にとって、問題の原因は番号で始まるrexファイルの名前付けでした:
20160216_tranlation.resx
下線を追加する必要がありました_
を呼び出すときにresxファイル名の前にGetGlobalResourceObject
:
public static string getResource(string key)
{
return HttpContext.GetGlobalResourceObject("_20160216_tranlation", key).ToString();
}
この例外がスローされる原因となった一時的なクラスを(テスト||デバッグ)中にForm.cs内に追加しました。 Form.resxファイル(名前||リソースID)が、フォームクラス名ではなく一時クラス名に変更されました。これは私に問題を引き起こしました。プロジェクトの一時クラス用に別のファイルを作成することで、これを(修正||軽減)しました。
Xamarin.Formsでこの問題が発生しました。プロジェクトの名前を変更しようとすると、同じエラーメッセージが表示されてリソースを読み込めなくなりました。
この問題を解決するには、テキストエディターで.csprojを変更し、埋め込みリソースの論理名を変更する必要がありました。
<EmbeddedResource Include="Localization\TextResources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>TextResources.Designer.cs</LastGenOutput>
<LogicalName>YourNewNamespaceName.TextResources.resources</LogicalName>
<SubType>Designer</SubType>
</EmbeddedResource>
また、自動生成されたクラスを再構築するときに注意してください。そこに記載されている名前空間が変更される可能性があります。
同じ状況になった人に役立つことを願っています。
1つの解決策は、resxファイルのプロパティをコンテンツから埋め込みリソースに変更してビルドすることです。今回は、u vil get
Windowsフォームアプリで部分的なフォームクラスの上にクラスを追加したときに、このエラーが発生しました。
パーシャルフォームクラスの下のクラスを移動したときになくなりました。
ResourceManager静的プロパティのデザイナーファイル(Resources.Designer.cs)の名前空間を修正しました。
以下のコードを参照してください。
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("XYZAssembly.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}