HOW TO:程序集内读取内嵌默认资源

原创 2006年05月20日 17:59:00
Author:水如烟

当用Reflector查看程序集资源时,我们通常都会看到三个类SR,SRCategoryAttribute和SRDescriptionAttribute,来读取当前程序集的资源信息。
在这里,所谓的默认我指的是在Framework2.0里。默认的资源名称一般是[RootNameSpace].Resources.resources。
三个类的代码在各程序集中基本是一样的,但因为各自的资源有异,它的Resourcemanager定义为Private,而其它的变量和方法,基本上是Shared。再一点,它只服务于本程序集,所以多用Friend限制作用范围。代码有些技巧,稍增改,如下:

SR.VB
Imports System.Resources, System.Globalization

Friend NotInheritable Class SR

    
'如是特殊名称,在这修改。默认的为[RootNameSpace].Resources.resources
    Friend Sub New()
        
Dim localAssembly As Reflection.Assembly = Reflection.Assembly.GetExecutingAssembly
        
Dim baseName As String = Nothing
        
For Each resourceName As String In localAssembly.GetManifestResourceNames
            
If System.Text.RegularExpressions.Regex.IsMatch(resourceName, ".Resources.resources$")  Then
                baseName 
= resourceName
                
Exit For
            
End If
        
Next
        
Me.m_resources = New ResourceManager(baseName, localAssembly)
    
End Sub

    
Private Shared Function GetLoader() As SR
        
If SR.loader Is Nothing Then
            
SyncLock SR.InternalSyncObject
                
If SR.loader Is Nothing Then
                    SR.loader 
= New SR
                
End If
            
End SyncLock
        
End If
        
Return loader
    
End Function

    
Public Shared Function GetObject(ByVal name As StringAs Object
        SR.GetLoader()
        
If SR.loader Is Nothing Then
            
Return Nothing
        
End If

        
Return SR.Resources.GetObject(name, SR.Culture)
    
End Function

    
Public Shared Function GetString(ByVal name As StringAs String
        SR.GetLoader()
        
If SR.loader Is Nothing Then
            
Return Nothing
        
End If

        
Return SR.Resources.GetString(name, SR.Culture)
    
End Function

    
Public Shared Function GetString(ByVal name As StringByVal ParamArray args As Object()) As String
        SR.GetLoader()
        
If SR.loader Is Nothing Then
            
Return Nothing
        
End If

        
Dim Result As String
        Result 
= SR.Resources.GetString(name, SR.Culture)
        
If ((args Is NothingOrElse (args.Length <= 0)) Then
            
Return Result
        
End If

        
Dim argsCount As Integer = 0
        
Do While argsCount < args.Length
            
Dim argString As String = TryCast(args(argsCount), String)
            
If (Not argString Is NothingAndAlso (argString.Length > 1024Then
                args(argsCount) 
= (argString.Substring(01021& "")
            
End If
            argsCount 
+= 1
        
Loop

        
Return String.Format(CultureInfo.CurrentCulture, Result, args)
    
End Function


    
Private Shared ReadOnly Property Culture() As CultureInfo
        
Get
            
Return Nothing '取本地CultureInfo
        End Get
    
End Property

    
Private Shared ReadOnly Property InternalSyncObject() As Object
        
Get
            
If (SR.s_InternalSyncObject Is NothingThen
                
Dim tmpObj As New Object
                System.Threading.Interlocked.CompareExchange(SR.s_InternalSyncObject, tmpObj, 
Nothing)
            
End If
            
Return SR.s_InternalSyncObject
        
End Get
    
End Property

    
Public Shared ReadOnly Property Resources() As ResourceManager
        
Get
            
Return SR.loader.m_resources
        
End Get

    
End Property


    
Private Shared loader As SR
    
Private Shared s_InternalSyncObject As Object

    
Private m_resources As ResourceManager

    
'Friend Const Text1 As String = "Text1"
End Class

SRCategoryAttribute.VB
Imports System.ComponentModel

<AttributeUsage(AttributeTargets.All)> _
Friend NotInheritable Class SRCategoryAttribute
    
Inherits CategoryAttribute

    
Public Sub New(ByVal category As String)
        
MyBase.New(category)
    
End Sub

    
Protected Overrides Function GetLocalizedString(ByVal value As StringAs String
        
Return SR.GetString(value)
    
End Function
End Class

SRDescriptionAttribute.VB
Imports System.ComponentModel

<AttributeUsage(AttributeTargets.All)> _
Friend NotInheritable Class SRDescriptionAttribute
    
Inherits DescriptionAttribute

    
Private replaced As Boolean

    
Public Sub New(ByVal description As String)
        
MyBase.New(description)
    
End Sub

    
Public Overrides ReadOnly Property Description() As String
        
Get
            
If Not Me.replaced Then
                
Me.replaced = True
                
MyBase.DescriptionValue = SR.GetString(MyBase.Description)
            
End If
            
Return MyBase.Description
        
End Get
    
End Property

End Class

wpf 图片资源引用问题

自学 wpf 经常 会遇到一些奇怪的问题,很多东西要去尝试,才能得到满意的答案    首先看我遇到问题,图片资源引用,如果是在wpf应用程序中,这样写是没有问题的. 如果换在把这个当dll文件 让别人...
  • suntanyong88
  • suntanyong88
  • 2015年01月04日 11:48
  • 9039

在.NET中读取嵌入和使用资源文件的方法

Dotnet中嵌入资源(位图、图标或光标等)有两种方式,一是直接把资源文件加入到项目,作为嵌入资源,在代码中通过Assembly的GetManifestResourceStream方法获取资源的Str...
  • orichisonic
  • orichisonic
  • 2016年11月22日 09:12
  • 1781

如何嵌入和使用 C# 来访问资源

C#中如何使用嵌入的资源? 本分步指南介绍如何使用 C# 来作为程序集的一部分嵌入资源,然后在运行时访问资源。 概述 .NET Framework 可以封装文件,为已编译的程序集的一部分...
  • testcs_dn
  • testcs_dn
  • 2013年05月06日 18:09
  • 8872

未能加载文件或程序集或它的某一个依赖项(针对资源问题,x86文件在x64上编译失败)

在开发中遇到过这样的问题,在x86系统上面可以编译通过的程序,在x64系统上编译出错,提示 未能加载文件或程序集 或它的某一个依赖项,如下图所示: 产生此问题的原因: 64 位系统上设置编译...
  • BohemianLife
  • BohemianLife
  • 2012年12月25日 13:14
  • 7220

第7章 Application类(1)——程序集资源

一、概述 程序集资源:即为项目添加的文件,经过VS编译会嵌入到EXE或DLL中。 程序集资源也称为二进制资源,因为他们作为不透明的二进制数据被嵌入到已编译的程序集中。 二、添加资源 ①在项目中建文件夹...
  • songyi160
  • songyi160
  • 2017年01月24日 17:25
  • 258

c#给自己写的程序集设置图标、版本设置、添加其他工程中资源文件示例图

如何给自己写的程序添加和设置图标?先看下图: 添加图标后的快捷方式也有图标了.下面看图说明如何操作:打开工程属性 选择[应用程序]选项卡,在[图标和清单]中选择图标,这样在生成的最终可自行程序就会...
  • xianfajushi
  • xianfajushi
  • 2013年07月05日 12:06
  • 4702

未能加载文件或程序集或它的某一个依赖项(针对资源问题,x86文件在x64上编译失败)

在开发中遇到过这样的问题,在x86系统上面可以编译通过的程序,在x64系统上编译出错,提示 未能加载文件或程序集 或它的某一个依赖项,如下图所示: 产生此问题的原因: 先检查确保应该添...
  • tessa_520
  • tessa_520
  • 2013年12月03日 11:40
  • 588

wpf多程序集之间共享资源字典--CLR名称空间未定义云云

以下介绍如何创建可用于在多个程序集之间共享的资源字典 1.新建Wpf自定义控件库,名称为MyContorlLib,项目资源结构图如下: 2.打开Themes文件夹中的Generic.xaml文...
  • zxh198964
  • zxh198964
  • 2012年10月28日 10:57
  • 5163

第10章 资源(3)——程序集间共享资源

一、概述 当共享包含一个或多个资源字典的编译过的程序集时,有三种方法提取所希望的资源并在应用程序中使用。 三种方法的前提是在应用程序中添加对共享程序集的引用 二、C#代码方式 只要知道资源所在...
  • songyi160
  • songyi160
  • 2017年01月26日 00:22
  • 352

图片资源内嵌实例(含源码)

  • 2008年10月14日 17:48
  • 587KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HOW TO:程序集内读取内嵌默认资源
举报原因:
原因补充:

(最多只允许输入30个字)