C# 如何在自定义服务器控件asp中使用.resx和.resource文件?

C# 如何在自定义服务器控件asp中使用.resx和.resource文件?,c#,asp.net,resx,resgen,C#,Asp.net,Resx,Resgen,我正在编写自己的服务器端控件,并使用存储在.resx文件中的图像。在控制台应用程序中,此代码可以正常工作: ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx"); foreach (DictionaryEntry d in rsxr) { Console.WriteLine(d.Key.ToString() + ":\t&q

我正在编写自己的服务器端控件,并使用存储在
.resx
文件中的图像。在控制台应用程序中,此代码可以正常工作:

     ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
        
     foreach (DictionaryEntry d in rsxr)
     {
        Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
     }

     rsxr.Close();
但是这里

      protected override void RenderContents(HtmlTextWriter output)
    {
        ResXResourceReader rsxr = new ResXResourceReader("Resource1.resx");
  
        base.RenderContents(output);

        foreach (DictionaryEntry d in rsxr)
        {
            output.Write(d.Key.ToString());
        }
        
    }
我得到这个错误:

找不到文件“C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\Resource1.resx”

我试图使用ResourceManager,但它需要一个
.resource
文件。我无法访问
resgen
工具(命令提示符不理解
resgen
命令)并安装它(在尝试过程中出现一些错误)

我的问题是:

  • 为什么我不能阅读
    .resx

  • 如何正确安装
    resgen
    工具


  • 谢谢。

    将资源文件存储在应用程序根目录中的
    App\u GlobalResources
    文件夹下或
    App\u LocalResources
    文件夹中,并使用与用户控制文件相同的名称,这被认为是一种良好的做法。例如,用户控件是uc.ascx,本地资源文件夹中的文件应该是uc.ascx.resx。这样更易于维护,asp.net将自动检测到它

    现在你的答案是:

    第一个问题: 使用
    Server.MapPath(“~/”)
    直接指向web.config所在的物理位置。如果要使用Controls文件夹中的资源文件,必须编写
    Server.MapPath(“~/Controls/Resource1.resx”)
    以获取路径

    不确定您想用resgen工具做什么?编译应用程序时,也会编译资源文件。选择您的资源文件并单击F4,它将显示您的生成操作,在生成操作中选择资源,您的资源文件将包含在程序集中


    您可以查看此帖子以了解更多信息:

    根据您的描述,我知道您需要找到并访问用户控件的资源文件。我发现它可以通过以下方式很好地工作:

  • 在项目级别创建一个应用程序全局资源(通过上下文菜单
    添加->添加ASP.NET文件夹->应用程序全局资源

  • 创建与控件同名的ressource文件,但位于应用程序\u GlobalResources中。例如,如果控件名为
    myControl.ascx
    ,则默认语言的ressource文件名必须为
    myControl.ascx.resx

  • 为所需的每种语言创建其他ressource文件。例如,如果您需要德语(“
    de
    ”),请添加myControl.ascx.de.resx

  • 添加类
    multi-languageUserControl
    ,如下所示:

    public class MultiLanguageUserControl : System.Web.UI.UserControl
    {
        public string getResValue(string id)
        {
            var ctrlPath = TemplateControl.AppRelativeVirtualPath;
            var ctrlFile = System.IO.Path.GetFileName(ctrlPath);
            var resObj = GetGlobalResourceObject(ctrlFile, id);
            if (resObj!=null)
                        return resObj.ToString();
            else
                        return string.Format("UNRESOLVED[{0}]", id);        
        }
    }
    
  • 打开myControl的代码隐藏,并使其从
    MultiLanguageUserControl
    继承,而不是从
    System.Web.UI.UserControl
    继承:

    公共部分类myControl:multi-languageUserControl{/…}


  • 在HTML代码中,使用新函数,例如:
    ,其中
    “resid”
    是要查找的ressource字符串的名称。您还可以使用HTML编码标记
    Ok。我对.resx文件使用[Embedded resource]选项。然后,您是否应该解释为什么此代码(在控制台应用程序中)给出MissingManifestResourceException[code]ResourceManager ResourceManager=new ResourceManager(“ConsoleApplication1.Resource1.resx”,GetType().Assembly);对象a=resourceManager.GetObject(“line.gif”);[/code]你问这个问题是很久以前的事了,但我有一个解决办法给你。