0

わからないバグがあります。

以下はうまくいきますが:

Resources.Classes.AFieldFormula.DirectFieldFormula

これは例外をスローします:

new ResourceManager(typeof(Resources.Classes.AFieldFormula)).GetString("DirectFieldFormula");

Could not find any resources appropriate for the specified culture or the neutral culture. Make sure \"Resources.Classes.AFieldFormula.resources\" was correctly embedded or linked into assembly \"MygLogWeb\" at compile time, or that all the satellite assemblies required are loadable and fully signed.

どうして?

リソースの designer.cs ファイル:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.18408
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace Resources.Classes {
    using System;


    /// <summary>
    ///   A strongly-typed resource class, for looking up localized strings, etc.
    /// </summary>
    // This class was auto-generated by the StronglyTypedResourceBuilder
    // class via a tool like ResGen or Visual Studio.
    // To add or remove a member, edit your .ResX file then rerun ResGen
    // with the /str option, or rebuild your VS project.
    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
    public class AFieldFormula {

        private static global::System.Resources.ResourceManager resourceMan;

        private static global::System.Globalization.CultureInfo resourceCulture;

        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
        internal AFieldFormula() {
        }

        /// <summary>
        ///   Returns the cached ResourceManager instance used by this class.
        /// </summary>
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        public static global::System.Resources.ResourceManager ResourceManager {
            get {
                if (object.ReferenceEquals(resourceMan, null)) {
                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MygLogWeb.Classes.AFieldFormula", typeof(AFieldFormula).Assembly);
                    resourceMan = temp;
                }
                return resourceMan;
            }
        }

        /// <summary>
        ///   Overrides the current thread's CurrentUICulture property for all
        ///   resource lookups using this strongly typed resource class.
        /// </summary>
        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
        public static global::System.Globalization.CultureInfo Culture {
            get {
                return resourceCulture;
            }
            set {
                resourceCulture = value;
            }
        }

        /// <summary>
        ///   Looks up a localized string similar to Direct field.
        /// </summary>
        public static string DirectFieldFormula {
            get {
                return ResourceManager.GetString("DirectFieldFormula", resourceCulture);
            }
        }
    }
}

私のリソース ファイルは、既定の名前空間が MygLogWeb である私のソリューションの \Classes フォルダーにあります。
しかし、resx プロパティ ウィンドウを使用して、「カスタム ツールの名前空間」を Resources.Classes として設定しました。

それは間違っていますか?フォルダに名前空間を反映させる必要は本当にありますか?

4

1 に答える 1

0

Hans Passant は、なぜそれがうまくいかなかったのかを説明しました。

そこで、.Net がそれを処理する方法を詳しく調べたところ、ResourceManager の代わりに Reflection を使用して処理を行いました。
そのため、タイプからリソースを取得したい場合は、これが唯一の安全なコンパイル方法かもしれません。

カスタム属性に対して行った方法は次のとおりです。

public class FriendlyNameAttribute : Attribute
{
    private delegate string dGetString();

    private dGetString dValue;

    public string ResourceName
    {
        get;
        private set;
    }

    public Type ResourceType
    {
        get;
        private set;
    }

    private void CheckValue()
    {
        this.dValue = () => this.ResourceName;

        if (this.ResourceType == null || !this.ResourceType.IsVisible ||  this.ResourceName == null)
        {
            return;
        }

        var property = this.ResourceType.GetProperty(this.ResourceName);

        if (property == null || property.PropertyType != typeof(string))
        {
            return;
        }

        this.dValue = () => (string)property.GetValue(null, null);
    }

    public FriendlyNameAttribute(string resourceName, Type resourceType = null)
    {
        this.ResourceName = resourceName;
        this.ResourceType = resourceType;
        this.CheckValue();
    }

    public string Value
    {
        get
        {
            return this.dValue();
        }
    }
}
于 2013-10-30T10:55:35.687 に答える