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
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

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

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

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

.Net程序集资源提取工具

  • 2017-08-04 17:59
  • 13KB
  • 下载

如何在C#中使用内嵌资源文件(转载学习)

简介 在好多的C#和 .Net的论坛中都会提到如何使用内嵌资源的话题,对大多一般的数项目来说,这也许更不就不是一个问题.但是,对于一些复杂的项目,这也许就成了问题.本文会把论坛中的内容汇总一下,比起...

如何在C#中使用内嵌资源文件

转自:http://www.weiw.com/article/list.asp?id=79简介 在好多的C#和 .Net的论坛中都会提到如何使用内嵌资源的话题,对大多一般的数项目来说,这也许更不就不是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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