Click here to Skip to main content
15,881,089 members
Articles / Programming Languages / Visual Basic 12
Tip/Trick

Extract Resources from an Assembly

Rate me:
Please Sign up or sign in to vote.
5.00/5 (1 vote)
18 May 2014CPOL3 min read 13.8K   481   8  
Demonstrates how to retrieve resources from a .NET Assembly in Visual Basic .NET

Introduction

This tip demonstrates how to retrieve resources from a .NET Assembly and the purpose is to share and learn.

Background

Recently, for fun only and to do something useful in my spare time, I was looking for a library to retrieve all resource files from a .NET Assembly in Visual Basic.NET? Actually, it is not quite difficult to handle resources files from Windows Form’s project and there are so many ways to deal with resources where you can store several type of files such as but not limited to........ dll, exe, text, image, xml ...and.......so on. The question was how I can do it?

Why Shall I Use Resources

May be it is seems like a silly question for some coders but actually it is not, because I saw so many questions here and there asking about resources, how to extract and how to handle it. Anyhow, my understanding to such a question is quite simple, resources representing data might be needed by an application to be stored or embedded directly into your application or by any other means.

However, since there is no library written particularly to Visual Basic.NET, I have decided to give it a try then started read here and there and finally was able to do it, and here it is the library, it is dedicated to all Visual Basic .NET community.

Classes of the Library

These are the classes and interfaces which make up the resources Grabber:

IGrabber

Represents the base interface of the Grabber class.

VB.NET
Imports System.ComponentModel

Public Interface IGrabber
    ReadOnly Property Events() As EventHandlerList
    Sub GrabResources(pathLocation As String, fileWildCard As String, grab As IGrabber)
    Sub GrabResources(fileName As String, grab As IGrabber)
    Sub GrabResources(grab As IGrabber)
    Sub GrabResources(data As Object)
    Sub CancelGrabbing()
    '// accessible properties of the grabber
    Property Folder As String
    Property Search As Boolean
    Property File As String
End Interface ' IGrabber
Grabber

Represents the class that is used to retrieve resources from an Assembly. Please refer to the attached file.

Delegates

Represents the delegates will occur as required by the Grabber class. Public Delegate Sub

VB.NET
Public Delegate Sub GrabCompletedEventHandler(sender As Object, e As EventArgs)

Public Delegate Sub GrabStartedEventHandler(sender As Object, fileName As String)

Public Delegate Sub GrabExceptionEventHandler(sender As Object, ex As Exception)

Grabber Class

The idea behind the Grabber class is to load an assembly and extract any resources within it and save under your application directory.

Grabber Constructor

VB.NET
#Region " constructor "
     Public Sub New()
        Me.Search = False
        Me.File = CType(Nothing, String)
        Me.Folder = CType(Nothing, String)
    End Sub

#End Region

    ' rest of the code goes here .........

Grabber Properties

Events

Represents EventHandlerList property used to store Grabber’s Delegates; it cannot be changed by derived classes.

Refer to: Declare Custom Events to Conserve Memory

Also, you may refer to my article in CodeProjet; Add Custom Event to a Class in VB.NET.

VB.NET
Public ReadOnly Property Events As ComponentModel.EventHandlerList Implements IGrabber.Events
    Get
        If _events Is Nothing Then
            _events = New EventHandlerList()
        End If
        Return _events
    End Get
End Property
Folder

Represents String property used to get or set the location where the grabbed resources are to be saved, it can be changed by derived classes.

VB.NET
Public Property Folder As String Implements IGrabber.Folder 
File

Represents String property used to get/set the assembly file name used to grab resources from it and can be changed by derived classes.

VB.NET
Public Property File As String Implements IGrabber.File 
Search

Represents Flag property to check sub-folders of Assembly file.

VB.NET
Public Property Search As Boolean Implements IGrabber.Search

Grabber Events

GrabCompleted

Represents a Custom Event occurs when grab is completed.

VB.NET
Public Custom Event GrabCompleted As GrabCompletedEventHandler
    AddHandler(value As GrabCompletedEventHandler)
        Me.Events.AddHandler("GrabCompletedEvent", value)
    End AddHandler

    RemoveHandler(value As GrabCompletedEventHandler)
        Me.Events.RemoveHandler("GrabCompletedEvent", value)
    End RemoveHandler

    RaiseEvent(sender As Object, e As EventArgs)
        CType(Me.Events("GrabCompletedEvent"), GrabCompletedEventHandler).Invoke(sender, e)
    End RaiseEvent
End Event
GrabStarted

Represents the Custom Event occurs when grab is started.

VB.NET
Public Custom Event GrabStarted As GrabStartedEventHandler
    AddHandler(value As GrabStartedEventHandler)
        Me.Events.AddHandler("GrabStartedEvent", value)
    End AddHandler

    RemoveHandler(value As GrabStartedEventHandler)
        Me.Events.RemoveHandler("GrabStartedEvent", value)
    End RemoveHandler

    RaiseEvent(sender As Object, fileName As String)
        CType(Me.Events("GrabStartedEvent"), GrabStartedEventHandler).Invoke(sender, fileName)
    End RaiseEvent
End Event
GrabberException

Represents Custom Event occurs when an exception is thrown during grabbing.

VB.NET
Public Custom Event GrabberException As GrabExceptionEventHandler
    AddHandler(value As GrabExceptionEventHandler)
        Me.Events.AddHandler("GrabberExceptionEvent", value)
    End AddHandler

    RemoveHandler(value As GrabExceptionEventHandler)
        Me.Events.RemoveHandler("GrabberExceptionEvent", value)
    End RemoveHandler

    RaiseEvent(sender As Object, ex As Exception)
        CType(Me.Events("GrabberExceptionEvent"), GrabExceptionEventHandler).Invoke(sender, ex)
    End RaiseEvent
End Event

Grabber Methods

Grab

Represents public method used to grab or retrieve resources from an Assembly.

VB.NET
Public Sub Grab()
    Me.GrabResources(Me)
End Sub
GrabResources

Represents overloaded friend methods used to load an assembly and grab or retrieve resources from it.

VB.NET
Friend Sub GrabResources(grab As IGrabber) Implements IGrabber.GrabResources
    _thread = New Thread(New ParameterizedThreadStart(AddressOf GrabResources))
    _thread.Start(grab)
End Sub

' rest of other overloaded Methods, code goes here .........
CancelGrabbing

Represents public method used to cancel or stop grab operation.

VB.NET
Public Sub CancelGrabbing() Implements IGrabber.CancelGrabbing
    Me._cancelGrabbing = True
End Sub
GetFileName

Represents public shared method to get file name from a string.

VB.NET
Public Shared Function GetFileName(fileNameString As String) As String
    If Not String.IsNullOrEmpty(fileNameString) Then
        Dim currentFileString As String = IO.Path.GetFileName(fileNameString)
        If currentFileString.EndsWith(".DLL", True, _
        CultureInfo.InvariantCulture) OrElse currentFileString.EndsWith_
        (".EXE", True, CultureInfo.InvariantCulture) Then
            currentFileString = currentFileString.Substring(0, currentFileString.Length - 4)
        End If
        Return currentFileString
    End If
    Return Nothing
End Function

Using the Code

VB.NET
Private resGrabber As Grabber
Private IsGrab As Boolean = False

Private Sub StartGrabbing()

    resGrabber = New Grabber
    ' set required data
    resGrabber.File = textBoxSource.Text
    resGrabber.Search = True

    Dim folderName As String = "Grabber"
    Dim folderText As String = IO.Path.GetDirectoryName(New Uri_
    (Reflection.Assembly.GetExecutingAssembly().CodeBase).LocalPath) & "\" & folderName

    ' Assign location og Grab Folder
    resGrabber.Folder = folderName & "\" & Grabber.GetFileName(resGrabber.File)

    ' Grab resources files
    IsGrab = True
    resGrabber.Grab()
    AddHandler resGrabber.GrabberException, New GrabExceptionEventHandler(AddressOf OnException)
    AddHandler resGrabber.GrabStarted, New GrabStartedEventHandler(AddressOf OnGrab)
    AddHandler resGrabber.GrabCompleted, New GrabCompletedEventHandler(AddressOf OnCompleted)

End Sub

' rest of the code goes here..........
'

For further details, please download the attached source code which shows how to do it ……. I hope you enjoy it!!!!!

References

  1. http://www.codeproject.com/Articles/229122/Add-Custom-Event-To-A-Class-in-VB-Net
  2. http://msdn.microsoft.com/en-us/library/vstudio/system.threading.parameterizedthreadstart
  3. http://msdn.microsoft.com/en-us/library/yt1k2w4e.aspx
  4. http://msdn.microsoft.com/en-us/library/70s77c20%28v=vs.110%29.aspx
  5. http://support.microsoft.com/kb/837908
  6. http://www.codeproject.com/Articles/13573/Extracting-Embedded-Images-From-An-Assembly
  7. http://www.nirsoft.net/utils/dot_net_resources_extract.html

Points of Interest

I know the library is not perfect. It has been collected from my readings and study of different similar codes in the network, but the benefits behind such a code is; now I have a good idea how to protect the .NET library and hope to share with you ASAP.

History

  • Release, May 18, 2014

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Engineer
Egypt Egypt
Oil & Gas Engineer
C# & VB.net
Coding For Fun Only

Comments and Discussions

 
-- There are no messages in this forum --