3

解決策の概要: 主な問題は、resx ファイルが App_LocalResources と App_GlobalResources 内のサブフォルダーにあることでした。.NET では物事をフォルダーに分けることは問題ありませんが、Mono はサブフォルダーを無視してそれらのフォルダー内のファイルのみを調べます。

問題 #2 は実行時にのみ機能します。つまり、Resources 名前空間は aspx またはページ内のスクリプト ブロック内のコードで使用できますが、コード ビハインドでは使用できません。適切なコード ビハインドで Resources 名前空間を使用したことがないように思われるため、3 つの問題はすべて解決されています。


以前は PC 上の .NET で作業していた ASP.NET アプリケーションがあり、Mono および MonoDevelop を使用して開発するために Mac に移行しようとしています。アプリケーションは、App_GlobalResources フォルダーと App_LocalResources フォルダーを利用します。アプリケーションは .NET で動作しましたが、後で説明するように Mono では正しく機能しません。バージョン情報は以下です。

OS: Mac OS 10.8.2 Mono: 2.10.9 ASP.NET: 4.0.30319.1 MonoDevelop: 3.0.5

どのサーバーが使用されているのか、それが MonoDevelop の一部なのか、Mono 自体なのか、別のものなのかがわからないため、これに MonoDevelop のタグを付けました。私はまだ Mono とそのパーツに十分慣れていません...

私が抱えている問題は、リソースへのアクセスを中心に展開しており、以下に概説するさまざまな関連する問題があります。

問題 1: meta:resourcekey が機能せず、「指定された virtualPath でリソース オブジェクトが見つかりませんでした。」エラー

アプリケーションのルートと、ページのローカライズが必要なサブフォルダーに、各ページの App_LocalResources フォルダーと resx ファイルがあります。meta:resourcekey 属性を持つページ上の要素には、関連するプロパティに resx ファイルの値が割り当てられていません。

たとえば、/Site/Home.aspx と、home.aspx.resx および関連する翻訳を含む /Site/App_LocalResources/Home フォルダーがあります。

NB、これを書いているときに、ファイルの大文字と小文字に関して名前が一致しないことに気付きましたが、それは問題ではありません。同じフォルダー内の別のページでテストしましたが、リソース値がレンダリングされません。

問題のページにはコードビハインドはありません。

アプリケーションのルートにある PageNotFound.aspx という別のページには、関連する resx ファイルが /App_LocalResources/PageNotFound/PageNotFound.aspx.resx にあります。

このページのコンテンツは基本的に次のとおりです (両方のページ レンダリングを削除した場合)

<h2><asp:Literal runat="server" meta:resourcekey="PageNotFound" /></h2>
<% string message = GetLocalResourceObject("Sorry.Template").ToString(); %>

これらの行の最初または 2 番目を削除しても、同じエラーが発生します。エラーが始まります:

System.Resources.MissingManifestResourceException: A resource object was not 
found at the specified virtualPath at
System.Web.Compilation.DefaultResourceProvider.GetLocalResourcesAssembly

最初の行を削除すると、実際にビルドされてページがレンダリングされますが、クラッシュして上記のエラーが発生します。

2行目を削除するとエラーも発生しますが、それはページが解析されていて、ランタイムがページクラスを構築しようとしている間です。

そのため、あるページでは meta:resourcekey 属性を使用してビルドおよび実行しているように見えますが、リソース値を基になるコントロールのプロパティにバインドしていません。別のページでは、リソースにアクセスしようとしてクラッシュするようです。奇妙なことに、クラッシュするページはマスター ページのない非常に単純なページであり、基本的に上記のコンテンツしかありません。もう一方のページはマスター ページで非常に複雑であり、レンダリングされます (つまり、パーサー エラーはありません) が、resourcekey 値はありません。割り当てられた....

私が見ることができる唯一の違いは、1 つのページがルート ディレクトリにあり、マスター ページがないことと、もう 1 つのページがサブ フォルダーにあり、マスター ページがあることです。図に行く!何か案は?

問題 2: リソースの名前空間が存在しない

.NET で利用可能な「リソース」名前空間を使用するページにアクセスすると、コンパイル時にアプリがビルドされるようにランタイム コンパイル エラーが発生しますが、ページが解析およびコンパイルされると (ランタイム) 例外が発生します。 ..

Compilation Error: CS0103: The name 'Resources' does not exist in the current context

コードはコード ビハインドにあります: (編集: 次の行は、私がテストしたと思います。私のコードは、コード ビハインド (コンパイル時) クラスでこの名前空間を使用することはありません。グローバル リソースが機能すると、名前空間は実行時に機能し、ただし、質問の上部にある要約で概説されているように、コンパイル時に名前空間を検証する必要があるシナリオではありません)

msg.Subject = Resources.EmailResources.Request_SubjectLine

またはaspx自体のスクリプトブロックで、つまり

<%= Resources.EmailResources.Request_SubjectLine %>

Resources 名前空間へのこれらのタイプのアクセスはどちらも機能しません。これが Mono で機能しないのはなぜですか。Mono フレームワークは、.NET のようにこのようなものを生成しませんか? (この名前空間階層は .NET 上の ASP.NET フレームワークによって生成されると確信しているため、これが Mono に実装されていないのではないでしょうか?)

問題 3: GetGlobalResourceObject(...) 呼び出しが Null を返す

コード ビハインドには、.NET で動作する GetGlobalResourceObject() への呼び出しがありますが、Mono で実行するとコードが例外をスローします。例えば:

hlContact.Text = GetGlobalResourceObject("CommonResources", "Contact").ToString();

私のフォルダー構造は、App_GlobalResources > CommonResources > CommonResources.resx で、デザイナー ファイル (CommonResources.Designer.cs) があります。

resx ファイルはすべて「EmbeddedResource」のビルド アクションでマークされ、「コピーしない」カスタム ツール「GlobalResourceProxyGenerator」を使用し、各ファイルに意味のあるリソース ID を持ちます。(つまり、.App_GlobalResources.CommonResources)

問題は、GetGlobalResourceObject() が null を返すことです... CommonResources リソースが見つかりません....

Mono は、resx ファイルを含むフォルダーに「*.resource」ファイルを作成していることに注意してください。

4

1 に答える 1

3

問題#1

どうやら mono はリソースのサブディレクトリを検索しないようです。つまり、App_LocalResourcesまたはに直接保持する必要がありますApp_GlobalResourcesmono ソース コードの関連部分(134 行目)を参照してください。サブディレクトリの検索が公式の機能である場合、これはバグであり、前述の行を変更することで簡単に修正できます。


問題#2

ここでは正常に動作します(Linux上)。


問題#3

リソースをどのように正確に埋め込んでいるかわかりませんが、小さなテスト プロジェクトが役立ちます。フレームワークはApp_GlobalResources実行時にそれらをコンパイルし、その後も正常にGetGlobalResourceObject動作します。

于 2012-11-24T04:02:18.503 に答える