Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#4481
Cita de: kenosis en 12 Septiembre 2015, 19:17 PMSe que hay varias maneras de Crackearlo pero se me ocurrió que la más simple era cambiar en el método CheckRegistration().

El problema es que no logro modificar el codigo IL para que quede de la forma anterior, modifique las primeras instrucciones Il con el Reflexil de la siguiente manera pero no funciona:

No intentes modificar manualmente las instrucciones IL si no sabes hacerlo correctamente (yo tampoco se mucho), dices que estás utilizando .Net Reflector + el plugin Reflexil y tienes localizado la función validatoria, entonces con el mismo Reflexil puedes modificar el código del método a tu semejanza utilizando la sintaxis VB.Net o C# del byte-code, es decir, modificar las órdenes para dejarlo más o menos así:

Código (vbnet) [Seleccionar]
Public Function CheckRegistration() As RegistrationState
   Me._isProLicense = True
   Return RegistrationState.Registered
End Function


No es necesario más que eso, olvida el código IL.

Aquí tienes un tutorial que hice con imágenes sobre cómo usar la opción "Replace all with code", por si te sirve de algo, pero no creas que soy experto ni nada parecido en la ing. inversa, simplemente me defiendo en la técnica Reflection ya que desarrollo bajo la plataforma .Net y eso siempre ayuda a entender lo que haces al craquear un ensamblado .Net:

[TUTORIAL] Craquear librería Nostalgia.Net (Reflection)

En el panel de Reflexil, lo configuras para usar la sintaxis de VB.Net, posteriormente seleccionas todas las instrucciones IL de la class PhotoPartyUpload.PhotoBoothUpload.Registration, presionas click derecho y seleccionas la opción "Replace all with code", seguidamente, reemplazas la class entera por el siguiente código modificado que te muestro aquí abajo, y compilas usando la misma versión del compiler de .NetFx que hayan usado originálmente al desarrollar la dll.

Debo mencionar que obviamente no puedo verificar que no sea necesario realizar más modificaciones de las que hice, o ignorar alguna modificación, pues aparte de que con la dll que subiste no es suficiente ya que faltan referencias a otras classes de otros ensamblados de la aplicación los cuales no has compartido, además de eso me ha sido imposible descargar el trial de la app para testearlo, ya que al parecer te piden la VISA y demás para un miserable trial, es de locos, así que si tienes problemas en compilar este código entonces envíame el instalador completo del tal PBU por mensaje privado y veré que puedo hacer, pero en principio esto te podría servir cómo solución final:

Código (vbnet) [Seleccionar]
Option Explicit On
Option Strict On

#Region " Imports "

   Imports System
   Imports System.Collections.Generic
   Imports System.Text

#End Region

Namespace PhotoPartyUpload.PhotoBoothUpload.Registration

Class Registration

Function CheckRegistration() As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState
Return RegistrationState.Registered
End Function

#Region " Methods stubs "

    Function get_LicenseData() As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
    Return Nothing
    End Function
   
    Sub set_LicenseData(ByVal value As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData)
    End Sub
   
    Function get_RemaningDaysTrial() As Integer
    Return Integer.MaxValue
    End Function
   
    Function GetCurrentTime() As System.DateTime
    Return DateTime.Now()
    End Function
   
    Function LoadLicenseData() As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
    Return Nothing
    End Function
   
    Sub SaveLicenseData(ByVal regData As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData)
    End Sub
   
    Function LoadRegistrationData() As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData
    Return New RegistrationData
    End Function
   
    Sub SaveRegistrationData(ByVal regData As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData)
    End Sub
   
    Shared Function KeyGenerator(ByVal name As String, ByVal systemCode As String, ByVal expiryDate As System.DateTime, ByVal updatesExpiryDate As System.DateTime, ByVal isProVersion As Boolean) As String
    Return String.Empty
    End Function
   
    Function DecodeLicense(ByVal name As String, ByVal systemCode As String, ByVal code As String) As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData
    Return Nothing
    End Function
   
    Sub SetCurrentTime(ByVal currentTime As System.DateTime)
    End Sub
   
    Function get_IsBasicLicense() As Boolean
    Return False
    End Function
   
    Function get_IsDemoMode() As Boolean
    Return False
    End Function
   
    Function get_IsProLicense() As Boolean
    Return True
    End Function
   
    Function get_LicenseCode() As String
    Return "2fa747e3-4604-46e5-9083-3d01aadb9499"
    End Function
   
    Shared Function GetSystemKey() As String
    Return String.Empty
    End Function
   
    Shared Function GetSystemInfo() As String
    Return String.Empty
    End Function
   
    Shared Function RunQuery(ByVal TableName As String, ByVal MethodName As String) As String
    Return String.Empty
    End Function
   
    Sub New()
    End Sub
   
    Shared Sub New()
    End Sub

#End Region

#Region " Fields stubs "

    Dim Shared TrialDays As Integer = Integer.MaxValue
    Dim Shared RegistrationSubKey As String = String.Empty
    Dim Shared RegistrationSubKeyOld As String = String.Empty
    Dim _registrationState As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationState = RegistrationState.Registered
    Dim _isProLicense As Boolean = True
    Dim _licenseCode As String = "2fa747e3-4604-46e5-9083-3d01aadb9499"
    Dim RegData As PhotoPartyUpload.PhotoBoothUpload.Registration.RegistrationData = New RegistrationData
    Dim Shared RegistrationKey As String = "{76995B8C-ECAF-4A37-8AE7-D2CFD9B303A5}"
    Dim Shared DataKey As String = "{C4D4B1C3-C9C9-4CFE-A70A-54358EE10109}"
    Dim IsRegistrationDisabled As Boolean = False
    ' Dim <LicenseData>k__BackingField As PhotoPartyUpload.PhotoBoothUpload.Registration.LicenseData

#End Region

End Class
End Namespace


Saludos
#4482
Cita de: 02k0 en 19 Septiembre 2015, 23:39 PM¿dónde están las Strings?

Si las cadenas de texto las hubieran añadido cómo recursos en un archivo administrado de recursos .Net entonces sería más facil hacerlo cómo pensaste al principio, pero no es el caso, la aplicación no fue pensada para la traducción de idioma, así que te va a costar más que eso, hecha mano de un decompiler.

Usando la aplicación .Net reflector de RedGate, es facil localizar los Strings, ya sea utilizando el buscador de Strings o navegando directamente hasta el método InitializeComponent en la class Form1, que es un método el cual se genera automáticamente por la IDE de Visual Studio cuando le asignas texto a los controles de la UI en tiempo de diseño, pues bien, allí en ese método verás, para empezar, una gran cantidad con cientos de strings Japos. En otros miembros de la misma class irás viendo el resto de cadenas de texto, que no son para nada pocas.

Nota:
Ten cuidado por que el programador utilizó caracteres Japos para definir el nombre de los espacios de nombre (NameSpaces) así cómo para asignar nombres internos que no debes modificar como por ejemplo al instanciar el Type Font o el Type Treenode y probablemente existan más órdenes que puedan causar conflictos, strings como el del primer parámetro del constructor Font no debes modificarlo (a menos que quieras personalizar la fuente de texto por otra):
CitarMe.Button_ibeyomi_jikkou.Font = New Font("MS ゴシック", 14.25!, FontStyle.Bold, GraphicsUnit.Point, &H80)

Te muestro una imagen de ayuda para modificar un string:

( Click para maximizar )


Saludos
#4484
Programación General / Re: ¿VS para Linux?
20 Septiembre 2015, 10:36 AM
Buenas

1. Visual Studio Code es un editor de texto liviano, en cambio Visual Studio es una IDE (con constructor de interfaz gráfica aka GUI Builder), no confundir, VS Code es un tipo de software comparable a Sublime Text o Notepad++.

2. BASIC no es lo mismo que Visual Basic ni mucho menos Visual Basic .Net (.Net Framework), estos dos últimos son derivados de BASIC, es decir, lenguajes basados en una sintaxis BASIC-like, al igual que lo son otros lenguajes cómo Pure BASIC o Simple BASIC, etc, ninguno es igual y el único que compila bajo el CIL de Microsoft es VB.Net.

3. Para desarrollar un ensamblado .Net bajo Linux las soluciones son muy limitadas y nada recomendables:


  • Puedes utilizar la IDE MonoDevelop, es una IDE mediocre aparte de ser la única opción para Linux.
    La implementación de Mono tiene toneladas de bugs y sinceramente no se cómo te las vas a apañar con la trivialidad del uso de la WinAPI si tuvieras algún código donde haces uso del P/Invoking, en Linux.
    Además hay muchos miembros, namespaces enteros de la librería de classes de .Net Framework que todavía no están implementados.
    http://www.monodevelop.com/
  • Puedes instalar la IDE Eclipse con un plugin que existe para añadir soporte C#, pero esto no lo he usado nunca, y dudo mucho que el plugin sea capaz de añadir un GUI Builder a las capacidades de la IDE.
    Lo que supuestamente hace es integrar Mono en la IDE, lo que se puede traducir en muchos posibles bugs.
    https://www.eclipse.org/downloads/
    http://emonic.sourceforge.net/
  • Puedes instalar una máquina virtual con Windows e instalar Visual Studio en el S.O. huésped, siendo esta la mejor opción dentro de lo que cabe por estar utilizando la IDE de programación más completa y avanzada del mercado (indiferentemente de los lenguajes que VS soporta) aunque sea en un entorno virtual.
    http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx
  • Puedes instalar una máquina virtual con Windows e instalar SharpDevelop si prefieres una IDE liviana, por supuesto es una opción mucho peor que utilizar Visual Studio (cómo todas las demás opciones) pero sería una mejor opción que utilizar MonoDevelop simplemente porque SharpDevelop es una IDE mucho más amistosa y con más características, no lo comparo por temas de bugs ni nada de eso.
    La mayor parte de la IDE de SharpDevelop está compuesta por llamadas a la WinAPI que lo vuelven algo inestable y además utiliza el compiler Mono, así que súmale muchos más bugs y conflictos en general.
    http://www.icsharpcode.net/OpenSource/SD/Default.aspx

Nota(s):
  • No es recomendable salir de Visual Studio siempre que tengas la oportunidad de usarlo, pero para desarrollar un código simple por supuesto SharpDevelop es una IDE que funciona bien al igual que lo es MonoDevelop, para cosas simples, no mas.

  • No intentes usar WINE para instalar SharpDevelop ni mucho menos el basto Visual Studio (y los runtimes de .Net Framework necesarios para correrlos) en Linux, según lo que leí siempre acabará en un gran FAIL.
    Usa una máquina virtual o confórmate con usar MonoDevelop.

Saludos
#4485
Cita de: MCKSys Argentina en 19 Septiembre 2015, 19:58 PMExplícate mejor!

Con que se moleste en escribir cómo una persona normal sería suficiente, y si, dando los detalles necesarios en la duda que tenga, pfff... me ha matado ese "holi xfi si" xd.

Esto no es el whatsapp., aparte, en el foro se tratan muchos lenguajes de programación, especifica exactamente cual estás utilizando y lo que quieres llevar a cabo.

Si lo que pretendes hacer es implementar un sistema de protección trial o algo parecido mediante validación de algún tipo (ej. un serial HWID) entonces hay programas dedicados a ello, cómo WinLicense, u otros dedicados a proteger aplicaciones .Net cómo Crypto Licensing o .Net Reactor, y cómo ya han mencionado siempre puedes desarrollar un algoritmo (menos sofisticado, claro está) por ti mismo/a.

Saludos!
#4486
Buenas

...¡Muchas preguntas!.

Yo no se apenas sobre temas tan específicos o triviales de redes, pero suponiendo que el IIS te sirviera (que no se si servirá para ese propósito en concreto), entonces te confirmo que si que puedes automatizar la instalación (cómo con cualquier otro paquete/característica de Windows) y habilitarlo arbitrariamente, ahora, por lo que comentas por tus propias conclusiones parece que no te sirve para controlar el tráfico saliente, no lo se.

Bueno, te explico de todas formas, con la herramienta de Microsoft llamada DISM (Deployment Image Servicing and Management) que ya viene integrada en Windows (también la puedes obtener en el SDK de Windows), puedes listar los nombres de las características de IIS disponibles en el S.O.:
Dism.exe /Get-Features /Format:Table /Online

Cita de: DISMIIS-ApplicationDevelopment
IIS-CommonHttpFeatures
IIS-HealthAndDiagnostics
IIS-HttpCompressionDynamic
IIS-HttpErrors
IIS-HttpLogging
IIS-HttpRedirect
IIS-HttpTracing
IIS-IIS6ManagementCompatibility
IIS-IPSecurity
IIS-LoggingLibraries
IIS-ManagementScriptingTools
IIS-Metabase
IIS-NetFxExtensibility
IIS-NetFxExtensibility45
IIS-Performance
IIS-RequestFiltering
IIS-RequestMonitor
IIS-Security
IIS-URLAuthorization
IIS-WebServer
IIS-WebServerManagementTools
IIS-WebServerRole

Con la misma herramienta puedes activar las características que requieras:
Dism.exe /Enable-Feature /FeatureName:"Nombre de característica" /Online /LimitAccess:"False" /English /LogPath:".\Dism.log" /LogLevel:"3"

Otra manera sería utilizando la herramienta pkmgr (Package Manager) de Microsoft, utilizando un archivo .xml de instalación desatendida de la característica en cuestión.
Using Unattended Setup to Install IIS 7.0 - Microsoft

PD: No existe forma programada para llevar a cabo esta tarea mediante la libreria de classes de VB.Net/C# o usando C++ (WinAPI), más que iniciar y controlar el estado y el buffer de salida del proceso (DISM.exe/pkgmgr.exe) de forma automatizada, o en su defecto utilizar la API de DISM (desarrollada en C/C++).

Tal vez con la class Win32_ServerFeature del instrumental de Windows (WMI) se pueda lograr algo:
Server Feature Provider - MSDN

EDITO: Y cómo en casi todo, siempre habrá wrappers de APIS de C++ para .Net que podrían estar bien, cómo este (no lo he probado):
Managed DismApi Wrapper - Codeplex

Saludos
#4487
CodeDomUtil.vb, una class que sirve para compilar, en tiempo de ejecución, código o archivos/soluciones escritos en VB.Net o C#.

CodeDomUtil.vb sustituye por completo a la antigua versión publicada aquí:
http://foro.elhacker.net/net/libreria_de_snippets_para_vbnet_compartan_aqui_sus_snippets-t378770.0.html;msg2021481#msg2021481

Añadí dos classes hijas que separan las funcionalidades (aunque basicamente son las mismas), estas son:

  • CodeDomUtil.VisualBasicCompiler
  • CodeDomUtil.CSharpCompiler

También añadí el evento CodeDomUtil.Compiler.CompilerWorkDone para desarrollar de manera más amistosa ...al suscribirse a este evento, vaya.

También hay definidas algunas plantillas de VB.Net y C#, plantila de consola, de WinForms, y de librería, pero estas plantillas más que para ser utilizadas sirven solamente cómo ejemplo (para testear el compiler o para mostrarle una estructura de código inicial al usuario). y más cosas que me dejo por nombrar.

El código fuente, aviso, son casi 2.000 lineas de código fuente, convendría separar las classes hijas, enumeraciones, constantes y demás para organizarlas en archivos distintos:
http://pastebin.com/Z7HMx5sg

Un ejemplo del compilador de VB.Net:
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

    ''' ----------------------------------------------------------------------------------------------------
    ''' <summary>
    ''' The VisualBasic.Net compiler instance.
    ''' </summary>
    ''' ----------------------------------------------------------------------------------------------------
    Dim WithEvents vbCompiler As CodeDomUtil.Compiler =
        New CodeDomUtil.VisualBasicCompiler(CodeDomUtil.CompilerVersions.V4)

    Private Sub Form1_Shown() Handles MyBase.Shown

        With Me.vbCompiler.Compilersettings
            .GenerateDebugInformation = True
            .GenerateWarnings = True
            .GenerateXmlDocumentation = True
            .HighEntropyEnabled = True
            .IntegerOverflowChecksEnabled = False
            .OptimizationsEnabled = True
            .Platform = CodeDomUtil.Platform.AnyCpu
            .SubsystemVersion = CodeDomUtil.SubsystemVersions.WindowsXP
            .TreatWarningsAsErrors = False
            .Verbose = True
            .VerboseSyntax = False
            .WarningLevel = CodeDomUtil.WarningLevelEnum.Level3
            .LibraryPaths.Add(IO.Directory.GetCurrentDirectory)
        End With

        Dim referencedAssemblies As New List(Of String)
        referencedAssemblies.AddRange({"System.dll", "System.Windows.Forms.dll"})

        ' Compile a VB Console App from string.
        vbCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.Console,
                                     targetFile:="C:\VB Default Console App.exe",
                                     sourceCode:=CodeDomUtil.Templates.TemplateVbConsoleApp,
                                     mainMemberName:="MainNamespace.MainModule",
                                     referencedAssemblies:=referencedAssemblies,
                                     resources:=Nothing,
                                     iconFile:=Nothing)

        ' Compile a VB WinForms App from string.
        vbCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.WinExe,
                                     targetFile:="C:\VB Default WinForms App.exe",
                                     sourceCode:=CodeDomUtil.Templates.TemplateVbWinFormsApp,
                                     mainMemberName:="MainNamespace.MainClass",
                                     referencedAssemblies:=referencedAssemblies,
                                     resources:=Nothing,
                                     iconFile:=Nothing)

        ' Compile a VB library from string.
        vbCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.DynamicLinkLibrary,
                                     targetFile:="C:\VB Default Library.dll",
                                     sourceCode:=CodeDomUtil.Templates.TemplateVbLib,
                                     mainMemberName:="MainNamespace.MainClass",
                                     referencedAssemblies:=referencedAssemblies,
                                     resources:=Nothing,
                                     iconFile:=Nothing)

        ' Compile a VB local file that contains the sourcecode.
        vbCompiler.CompileFromFile(netAssembly:=CodeDomUtil.NetAssembly.WinExe,
                                   targetFile:="C:\VB Custom App.exe",
                                   sourceFile:="C:\SourceCode.vb",
                                   mainMemberName:="MainNamespace.MainClass",
                                   referencedAssemblies:=referencedAssemblies,
                                   resources:=Nothing,
                                   iconFile:=Nothing)

    End Sub

    ''' ----------------------------------------------------------------------------------------------------
    ''' <summary>
    ''' Handles the <see cref="CodeDomUtil.Compiler.CompilerWorkDone"/> event of the <see cref="vbCompiler"/> instance.
    ''' </summary>
    ''' ----------------------------------------------------------------------------------------------------
    ''' <param name="sender">
    ''' The source of the event.
    ''' </param>
    '''
    ''' <param name="e">
    ''' The <see cref="CodeDomUtil.Compiler.CompilerWorkDoneEventArgs"/> instance containing the event data.
    ''' </param>
    ''' ----------------------------------------------------------------------------------------------------
    Public Sub VbCompiler_CompilerWorkDone(ByVal sender As Object, ByVal e As CodeDomUtil.Compiler.CompilerWorkDoneEventArgs) _
    Handles vbCompiler.CompilerWorkDone

        Console.WriteLine(String.Format("Compiler: {0}", e.CodeDomProvider.ToString))
        Console.WriteLine(String.Format("Parameters: {0}", e.CompilerParameters.CompilerOptions))

        For Each war As CodeDomUtil.Compiler.Warning In e.CompilerWarnings
            Console.WriteLine(String.Format("{0}| Warning: {1}", war.ErrorNumber, war.ErrorText))
        Next war

        For Each err As CodeDomUtil.Compiler.Error In e.CompileErrors
            Console.WriteLine(String.Format("{0}| Error: {1}", err.ErrorNumber, err.ErrorText))
        Next err

        If Not e.CompileErrors.Any Then
            Console.WriteLine(String.Format("Compilation Successful: {0}", e.TargetFilePath))
        End If

        Console.WriteLine()

    End Sub

End Class


Un ejemplo del compilador de C#:
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' The C# compiler instance.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Dim WithEvents csCompiler As CodeDomUtil.Compiler =
       New CodeDomUtil.CSharpCompiler(CodeDomUtil.CompilerVersions.V4)

   Private Sub Form1_Shown() Handles MyBase.Shown

       With Me.csCompiler.Compilersettings
           .GenerateDebugInformation = True
           .GenerateWarnings = True
           .GenerateXmlDocumentation = True
           .HighEntropyEnabled = True
           .IntegerOverflowChecksEnabled = False
           .OptimizationsEnabled = True
           .OutputLanguage = New CultureInfo("en-US")
           .Platform = CodeDomUtil.Platform.AnyCpu
           .SubsystemVersion = CodeDomUtil.SubsystemVersions.WindowsXP
           .TreatWarningsAsErrors = False
           .Verbose = True
           .VerboseSyntax = False
           .WarningLevel = CodeDomUtil.WarningLevelEnum.Level3
           .LibraryPaths.Add(IO.Directory.GetCurrentDirectory)
       End With

       Dim referencedAssemblies As New List(Of String)
       referencedAssemblies.AddRange({"System.dll", "System.Windows.Forms.dll"})

       ' Compile a C# Console App from string.
       csCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.Console,
                                    targetFile:="C:\CS Default Console App.exe",
                                    sourceCode:=CodeDomUtil.Templates.TemplateCsConsoleApp,
                                    mainMemberName:="MainNamespace.MainClass",
                                    referencedAssemblies:=referencedAssemblies,
                                    resources:=Nothing,
                                    iconFile:=Nothing)

       ' Compile a C# WinForms App from string.
       csCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.WinExe,
                                    targetFile:="C:\CS Default WinForms App.exe",
                                    sourceCode:=CodeDomUtil.Templates.TemplateCsWinFormsApp,
                                    mainMemberName:="MainNamespace.MainClass",
                                    referencedAssemblies:=referencedAssemblies,
                                    resources:=Nothing,
                                    iconFile:=Nothing)

       ' Compile a C# library from string.
       csCompiler.CompileFromString(netAssembly:=CodeDomUtil.NetAssembly.DynamicLinkLibrary,
                                    targetFile:="C:\CS Default Library.dll",
                                    sourceCode:=CodeDomUtil.Templates.TemplateCsLib,
                                    mainMemberName:="MainNamespace.MainClass",
                                    referencedAssemblies:=referencedAssemblies,
                                    resources:=Nothing,
                                    iconFile:=Nothing)

       ' Compile a C# local file that contains the sourcecode.
       csCompiler.CompileFromFile(netAssembly:=CodeDomUtil.NetAssembly.WinExe,
                                  targetFile:="C:\CS Custom App.exe",
                                  sourceFile:="C:\SourceCode.cs",
                                  mainMemberName:="MainNamespace.MainClass",
                                  referencedAssemblies:=referencedAssemblies,
                                  resources:=Nothing,
                                  iconFile:=Nothing)

   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Handles the <see cref="CodeDomUtil.Compiler.CompilerWorkDone"/> event of the csCompiler instance.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="sender">
   ''' The source of the event.
   ''' </param>
   '''
   ''' <param name="e">
   ''' The <see cref="CodeDomUtil.Compiler.CompilerWorkDoneEventArgs"/> instance containing the event data.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   Public Sub CsCompiler_CompilerWorkDone(ByVal sender As Object, ByVal e As CodeDomUtil.Compiler.CompilerWorkDoneEventArgs) _
   Handles csCompiler.CompilerWorkDone

       Console.WriteLine(String.Format("Compiler: {0}", e.CodeDomProvider.ToString))
       Console.WriteLine(String.Format("Parameters: {0}", e.CompilerParameters.CompilerOptions))

       For Each war As CodeDomUtil.Compiler.Warning In e.CompilerWarnings
           Console.WriteLine(String.Format("{0}| Warning: {1}", war.ErrorNumber, war.ErrorText))
       Next war

       For Each err As CodeDomUtil.Compiler.Error In e.CompileErrors
           Console.WriteLine(String.Format("{0}| Error: {1}", err.ErrorNumber, err.ErrorText))
       Next err

       If Not e.CompileErrors.Any Then
           Console.WriteLine(String.Format("Compilation Successful: {0}", e.TargetFilePath))
       End If

       Console.WriteLine()

   End Sub

End Class


Por último, muestro el diagrama de class:








Espero que les haya servido de algo este aporte.

Saludos!
#4488
RegExUtil.vb, es una class que expone funcionalidades relacionadas con las expresiones regulares, cómo validar una expresión u obtener (solamente) las posiciones de las coincidencias encontradas.

También expone algunas expresiones esándar y no tan estándar (la mayoría las tomé prestadas del aporte del compañero WHK aquí: http://foro.elhacker.net/programacion_general/hilo_oficial_solicitudes_de_expresiones_regulares-t434833.0.html )

Source:
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 07-July-2015
' ***********************************************************************
' <copyright file="RegExUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Public Members Summary "

#Region " Functions "

' RegExUtil.GetMatchesPositions(Regex, String, Integer) As IEnumerable(Of RegExUtil.MatchPosition)
' RegExUtil.Validate(String, Boolean) As Boolean

#End Region

#Region " Constants "

' RegExUtil.Patterns.CreditCard As String
' RegExUtil.Patterns.EMail As String
' RegExUtil.Patterns.HtmlTag As String
' RegExUtil.Patterns.Ipv4 As String
' RegExUtil.Patterns.Ipv6 As String
' RegExUtil.Patterns.SafeText As String
' RegExUtil.Patterns.Url As String
' RegExUtil.Patterns.USphone As String
' RegExUtil.Patterns.USssn As String
' RegExUtil.Patterns.USstate As String
' RegExUtil.Patterns.USzip As String

#End Region

#Region " Types "

' RegExUtil.MatchPosition

#End Region

#Region " Child Classes "

' RegExUtil.Patterns

#End Region

#End Region

#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text.RegularExpressions

#End Region

#Region " RegEx Util "

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Contains related RegEx utilities.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
Public NotInheritable Class RegExUtil

#Region " Types "

#Region " MatchPosition "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Encapsulates a text value captured by a RegEx, with its start/end index.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   <Serializable>
   Public NotInheritable Class MatchPosition

#Region " Properties "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets the text value.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The text value.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public ReadOnly Property Text As String
           Get
               Return Me.textB
           End Get
       End Property
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' ( Backing Field )
       ''' The text value.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Private ReadOnly textB As String

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets the start index.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The start index.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public ReadOnly Property StartIndex As Integer
           Get
               Return Me.startIndexB
           End Get
       End Property
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' ( Backing Field )
       ''' The start index.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Private ReadOnly startIndexB As Integer

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets the end index.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>
       ''' The end index.
       ''' </value>
       ''' ----------------------------------------------------------------------------------------------------
       Public ReadOnly Property EndIndex As Integer
           Get
               Return Me.endIndexB
           End Get
       End Property
       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' ( Backing Field )
       ''' The end index.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Private ReadOnly endIndexB As Integer

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Gets the text length.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <value>The text length.</value>
       ''' ----------------------------------------------------------------------------------------------------
       Public ReadOnly Property Length As Integer
           Get
               Return Me.valueB.Length
           End Get
       End Property

#End Region

#Region " Constructors "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Prevents a default instance of the <see cref="MatchPosition"/> class from being created.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Private Sub New()
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Initializes a new instance of the <see cref="MatchPosition"/> class.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="text">
       ''' The rtext value.
       ''' </param>
       '''
       ''' <param name="startIndex">
       ''' The start index.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       Public Sub New(ByVal text As String,
                      ByVal startIndex As Integer)

           Me.textB = text
           Me.startIndexB = startIndex
           Me.endIndexB = (startIndex + text.Length)

       End Sub

#End Region

   End Class

#End Region

#End Region

#Region " Child Classes "

#Region " Patterns "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' A class that exposes common RegEx patterns.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Public NotInheritable Class Patterns

#Region " Constants "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches an URL.
       '''
       ''' For Example:
       ''' http://url
       ''' ftp://url
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const Url As String =
           "^((((https?|ftps?|gopher|telnet|nntp)://)|(mailto:|news:))(%[0-9A-Fa-f]{2}|[-()_.!~*';/?:@&=+$,A-Za-z0-9])+)([).!';/?:,][[:blank:]])?$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches the content of an Html enclosed tag.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const HtmlTag As String =
           ">([^<]+?)<"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches an IPv4 address.
       '''
       ''' For Example:
       ''' 127.0.0.1
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const Ipv4 As String =
           "((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches an IPv6 address.
       '''
       ''' For Example:
       ''' FE80:0000:0000:0000:0202:B3FF:FE1E:8329
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const Ipv6 As String =
           "(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]).){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches a valid e-mail address.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const EMail As String =
           "^[a-zA-Z0-9+&*-]+(?:\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\.)+[a-zA-Z]{2,7}$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches lower and upper case letters and all digits.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const SafeText As String =
           "^[a-zA-Z0-9 .-]+$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches a valid credit card number.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const CreditCard As String =
           "^((4\d{3})|(5[1-5]\d{2})|(6011)|(7\d{3}))-?\d{4}-?\d{4}-?\d{4}|3[4,7]\d{13}$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches an United States zip code with optional dash-four.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const USzip As String =
           "^\d{5}(-\d{4})?$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches an United States phone number with or without dashes.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const USphone As String =
           "^\D?(\d{3})\D?\D?(\d{3})\D?(\d{4})$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches a 2 letter United States state abbreviations.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const USstate As String =
           "^(AE|AL|AK|AP|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MP|MT|NE|NV|NH|NJ|NM|NY|NC|ND|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)$"

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' A pattern that matches a 9 digit United States social security number with dashes.
       '''
       ''' For Example:
       '''
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       Public Const USssn As String =
           "^\d{3}-\d{2}-\d{4}$"

#End Region

   End Class

#End Region

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Validates the specified regular expression pattern.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="pattern">
   ''' The RegEx pattern.
   ''' </param>
   '''
   ''' <param name="ignoreErrors">
   ''' If set to <c>true</c>, ignore validation errors, otherwise, throws an exception if validation fails.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if pattern validation success, <c>False</c> otherwise.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function Validate(ByVal pattern As String,
                                   Optional ByVal ignoreErrors As Boolean = True) As Boolean

       Try
           Dim regEx As New Regex(pattern:=pattern)
           Return True

       Catch ex As Exception
           If Not ignoreErrors Then
               Throw
           End If
           Return False

       End Try

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <example><code>
   ''' Dim regEx As New Regex("Dog", RegexOptions.IgnoreCase)
   '''
   ''' Dim text As String = "One Dog!, Two Dogs!, three Dogs!"
   ''' RichTextBox1.Text = text
   '''
   ''' Dim matchesPos As IEnumerable(Of RegExUtil.MatchPosition) = RegExUtil.GetMatchesPositions(regEx, text, groupIndex:=0)
   '''
   ''' For Each matchPos As RegExUtil.MatchPosition In matchesPos
   '''
   '''     Console.WriteLine(text.Substring(matchPos.StartIndex, matchPos.Length))
   '''
   '''     With RichTextBox1
   '''         .SelectionStart = matchPos.StartIndex
   '''         .SelectionLength = matchPos.Length
   '''         .SelectionBackColor = Color.IndianRed
   '''         .SelectionColor = Color.WhiteSmoke
   '''         .SelectionFont = New Font(RichTextBox1.Font.Name, RichTextBox1.Font.SizeInPoints, FontStyle.Bold)
   '''     End With
   '''
   ''' Next matchPos
   '''
   ''' With RichTextBox1
   '''     .SelectionStart = 0
   '''     .SelectionLength = 0
   ''' End With
   ''' </code></example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Validates the specified regular expression pattern.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="regEx">
   ''' The RegEx pattern.
   ''' </param>
   '''
   ''' <param name="text">
   ''' If set to <c>true</c>, ignore validation errors, otherwise, throws an exception if validation fails.
   ''' </param>
   '''
   ''' <param name="groupIndex">
   ''' If set to <c>true</c>, ignore validation errors, otherwise, throws an exception if validation fails.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if pattern validation success, <c>False</c> otherwise.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Iterator Function GetMatchesPositions(ByVal regEx As Regex,
                                                       ByVal text As String,
                                                       Optional ByVal groupIndex As Integer = 0) As IEnumerable(Of MatchPosition)

       Dim match As Match = regEx.Match(text)

       Do While match.Success

           Yield New MatchPosition(value:=match.Groups(groupIndex).Value,
                                   startIndex:=match.Groups(groupIndex).Index)

           match = match.NextMatch

       Loop

   End Function

#End Region

End Class

#End Region
#4489
ResourceUtil.vb, es el comienzo de una class para administrar los recursos de la aplicación actual, aunque por el momento solo tiene un método genérico GetResources(Of T) que cómo su nombre nidica, obtiene los recursos del tipo especificado.

Para un código mucho más completo y extenso que sirve para administrar un archivo de recurso de .Net (resource.ResX) vease este otro aporte:
ResXManager.vb

Source:
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 16-June-2015
' ***********************************************************************
' <copyright file="ResourceUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Public Members Summary "

#Region " Functions "

' ResourceUtil.GetResources(OF T)

#End Region

#End Region

#Region " Option Statements "

Option Strict On
Option Explicit On
Option Infer Off

#End Region

#Region " Imports "

Imports System
Imports System.Globalization

#End Region

''' <summary>
''' Contains related application's managed resource utilities.
''' </summary>
Public NotInheritable Class ResourceUtil

#Region " Constructors "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Prevents a default instance of the <see cref="ResourceUtil"/> class from being created.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Private Sub New()
   End Sub

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' Title : Get Application Resources Of Type...
   ''' Author: Elektro
   ''' Date  : 16-June-2015
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <example> Get all String resources.
   ''' <code>
   ''' Dim resources As IEnumerable(Of DictionaryEntry) = GetResources(Of Bitmap)()
   '''
   ''' For Each resource As DictionaryEntry In resources
   '''
   '''     MsgBox(resource.Key)            '  Resource Name
   '''     MsgBox(resource.Value.ToString) '  Resource Data
   '''
   ''' Next resource
   ''' </code>
   ''' </example>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets the application resources of the specified type.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' The type of the resource to find.
   ''' </typeparam>
   '''
   ''' <param name="culture">
   ''' The resource culture
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <see cref="IEnumerable(Of DictionaryEntry)"/>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   Public Shared Function GetResources(Of T)(Optional ByVal culture As CultureInfo = Nothing) As IEnumerable(Of DictionaryEntry)

       Return From resource As DictionaryEntry
              In My.Resources.ResourceManager.
                              GetResourceSet(If(culture Is Nothing,
                                                CultureInfo.CurrentCulture,
                                                culture), createIfNotExists:=True, tryParents:=True).Cast(Of DictionaryEntry)()
              Where TypeOf resource.Value Is T

   End Function

#End Region

End Class












Un simple ejemplo de uso de la librería AndroidLib para .Net
https://github.com/regaw-leinad/AndroidLib

Otros ejemplos oficiales:
https://github.com/regaw-leinad/AndroidLib-Samples-VB

Source:
Código (vbnet) [Seleccionar]
Imports RegawMOD.Android

Public Class Form1

   Dim android As AndroidController
   Dim device As Device
   Dim serial As String

   Private Sub Test() Handles MyBase.Shown

       ' Usually, you want to load this at startup, may take up to 5 seconds to initialize/set up resources/start server.
       Me.android = AndroidController.Instance

       Using Me.android

           ' Always call UpdateDeviceList() before using AndroidController on devices, to get the most updated list.
           Me.android.UpdateDeviceList()

           If Me.android.HasConnectedDevices Then

               Me.serial = android.ConnectedDevices(0)
               Me.device = android.GetConnectedDevice(serial)

               device.BuildProp.Keys.
                   ForEach(Sub(propertyName As String)

                               Console.WriteLine(String.Format("{0}: {1}",
                                                               propertyName,
                                                               device.BuildProp.GetProp(propertyName)))

                           End Sub)

           End If

       End Using

   End Sub

End Class
#4490
CursorUtil.vb, es una class que por el momento sirve cómo un simple wrapper de la función LoadCursorFromFile de la WinAPI, la cual nos permite evadir las limitaciones de un WindowsForms para poder cargar y utilizar un cursor que no sea blanco y negro.

Source:
Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 08-September-2015
' ***********************************************************************
' <copyright file="CursorUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.IO
Imports System.Linq
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

#End Region

''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Contains related cursor utilities.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
Public NotInheritable Class CursorUtil

#Region " P/Invoking "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Platform Invocation methods (P/Invoke), access unmanaged code.
   ''' This class does not suppress stack walks for unmanaged code permission.
   ''' <see cref="System.Security.SuppressUnmanagedCodeSecurityAttribute"/> must not be applied to this class.
   ''' This class is for methods that can be used anywhere because a stack walk will be performed.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <remarks>
   ''' MSDN Documentation: <see href="http://msdn.microsoft.com/en-us/library/ms182161.aspx"/>
   ''' </remarks>
   ''' ----------------------------------------------------------------------------------------------------
   Private NotInheritable Class NativeMethods

#Region " Functions "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Creates a cursor based on data contained in a file.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="filepath">
       ''' The source of the file data to be used to create the cursor.
       ''' The data in the file must be in either .CUR or .ANI format.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <returns>
       ''' If the function is successful, the return value is an <see cref="IntPtr"/> to the new cursor.
       ''' If the function fails, the return value is <see cref="IntPtr.Zero"/>.
       ''' To get extended error information, call <see cref="Marshal.GetLastWin32Error"/>.
       ''' </returns>
       ''' ----------------------------------------------------------------------------------------------------    
       ''' <remarks>
       ''' MSDN Documentation: <see href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms648392%28v=vs.85%29.aspx"/>
       ''' </remarks>
       ''' ----------------------------------------------------------------------------------------------------
       <DllImport("User32.dll", CharSet:=CharSet.Ansi, BestFitMapping:=False, ThrowOnUnmappableChar:=True, SetLastError:=True)>
       Friend Shared Function LoadCursorFromFile(
              ByVal filepath As String
       ) As IntPtr
       End Function

#End Region

   End Class

#End Region

#Region " Constructors "

   ''' <summary>
   ''' Prevents a default instance of the <see cref="CursorUtil"/> class from being created.
   ''' </summary>
   Private Sub New()
   End Sub

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Creates a cursor based on data contained in a managed .Net resource.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <param name="resource">
   ''' The raw resource data.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <see cref="System.Windows.Forms.Cursor"/>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <exception cref="Exception">
   ''' </exception>
   '''
   ''' <exception cref="Win32Exception">
   ''' </exception>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Public Shared Function LoadCursorFromResource(ByVal resource As Byte(),
                                                 Optional cleanTempFile As Boolean = False) As Cursor

       Dim tmpFilepath As String = Path.GetTempFileName

       Try
           Using fs As New FileStream(tmpFilepath, FileMode.Create, FileAccess.Write, FileShare.Read)
               fs.Write(resource, 0, resource.Length)
           End Using

           Dim result As IntPtr = NativeMethods.LoadCursorFromFile(tmpFilepath)
           Dim win32Err As Integer = Marshal.GetLastWin32Error

           If (result = IntPtr.Zero) Then
               Throw New Win32Exception([error]:=win32Err)
           Else
               Return New Cursor(result)
           End If

       Catch ex As Exception
           Throw

       Finally
           If (cleanTempFile) AndAlso (File.Exists(tmpFilepath)) Then
               File.Delete(tmpFilepath)
           End If

       End Try

   End Function

#End Region

End Class











SerializationUtil.vb, es una class para serializar y deserializar datos en binario o Xml de forma (más)sencilla y haciendo uso de Generics.

Código (vbnet) [Seleccionar]
' ***********************************************************************
' Author   : Elektro
' Modified : 05-September-2015
' ***********************************************************************
' <copyright file="SerializationUtil.vb" company="Elektro Studios">
'     Copyright (c) Elektro Studios. All rights reserved.
' </copyright>
' ***********************************************************************

#Region " Imports "

Imports System
Imports System.Data
Imports System.IO
Imports System.Linq
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.Xml.Serialization

#End Region

''' <summary>
''' Contains related serialization utilities.
''' </summary>
Public NotInheritable Class SerializationUtil

#Region " Constructors "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Prevents a default instance of the <see cref="SerializationUtil"/> class from being created.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Private Sub New()
   End Sub

#End Region

#Region " Private Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets the proper data serializer.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="format">
   ''' The serialization format.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <exception cref="System.ArgumentException">
   ''' Wrong Serialization Format.
   ''' </exception>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Private Shared Function GetSerializer(Of T)(ByVal format As SerializationFormat) As Object

       Select Case format

           Case SerializationFormat.Binary
               Return New BinaryFormatter

           Case SerializationFormat.Xml
               Return New XmlSerializer(type:=GetType(T))

           Case Else
               Throw New ArgumentException(message:="Wrong Serialization Format.", paramName:="serializationFormat")

       End Select

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Gets the proper data serializer.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="obj">
   ''' The object to check.
   ''' </param>
   '''
   ''' <param name="format">
   ''' The serialization format.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Private Shared Function GetSerializer(Of T)(ByVal obj As T,
                                               ByVal format As SerializationFormat) As Object

       Select format

           Case SerializationFormat.Binary
               Return New BinaryFormatter()

           Case SerializationFormat.Xml
               Return New XmlSerializer(obj.GetType)

           Case Else
               Throw New ArgumentException(message:="Wrong Serialization Format.", paramName:="serializationFormat")

       End Select

   End Function

#End Region

#Region " Public Methods "

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Serializes the data of an Object to the specified file, using the specified serialization format.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="obj">
   ''' The object to be serialized.
   ''' </param>
   '''
   ''' <param name="filepath">
   ''' The filepath where to save the serialized data.
   ''' </param>
   '''
   ''' <param name="format">
   ''' The serialization format.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Public Shared Sub Serialize(Of T)(ByVal obj As T,
                                     ByVal filepath As String,
                                     ByVal format As SerializationFormat)

       Dim serializer As Object = SerializationUtil.GetSerializer(obj, format)

       Using fs As New FileStream(filepath, FileMode.Create, FileAccess.Write, FileShare.Read)

           Select Case serializer.GetType

               Case GetType(BinaryFormatter)
                   DirectCast(serializer, BinaryFormatter).Serialize(fs, obj)

               Case GetType(XmlSerializer)
                   DirectCast(serializer, XmlSerializer).Serialize(fs, obj)

           End Select

       End Using

   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Deserializes the data of an Object from the specified file, using the specified deserialization format.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="filepath">
   ''' The filepath where from deserialize the serialized data.
   ''' </param>
   '''
   ''' <param name="format">
   ''' The serialization format.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Public Shared Function Deserialize(Of T)(ByVal filepath As String,
                                            ByVal format As SerializationFormat) As T

       Dim serializer As Object = SerializationUtil.GetSerializer(Of T)(format)

       Using fs As New FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read)

           Select Case serializer.GetType

               Case GetType(BinaryFormatter)
                   Return DirectCast(DirectCast(serializer, BinaryFormatter).Deserialize(fs), T)

               Case GetType(XmlSerializer)
                   Return DirectCast(DirectCast(serializer, XmlSerializer).Deserialize(fs), T)

           End Select

       End Using

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Deserializes the data of an Object from the specified file, using the specified deserialization format.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="filepath">
   ''' The filepath where from deserialize the serialized data.
   ''' </param>
   '''
   ''' <param name="format">
   ''' The serialization format.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   <DebuggerStepThrough>
   <DebuggerHidden>
   Public Shared Sub Deserialize(Of T)(ByRef refObj As T,
                                       ByVal filepath As String,
                                       ByVal format As SerializationFormat)

       refObj = SerializationUtil.Deserialize(Of T)(filepath, format)

   End Sub

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether the specified <see cref="Type"/> can be serialized.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' The <see cref="Type"/> to check.
   ''' </typeparam>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the specified <see cref="Type"/> can be serialized; otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   Public Shared Function IsTypeSerializable(Of T)() As Boolean

       Return Attribute.IsDefined(GetType(T), GetType(SerializableAttribute))

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether the specified <see cref="Type"/> can be serialized.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="type">
   ''' The <see cref="Type"/> to check.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the specified <see cref="Type"/> can be serialized; otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   Public Shared Function IsTypeSerializable(Of T)(ByVal type As T) As Boolean

       Return SerializationUtil.IsTypeSerializable(Of T)()

   End Function

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' Determines whether the specified object can be serialized.
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <typeparam name="T">
   ''' </typeparam>
   '''
   ''' <param name="obj">
   ''' The object to check.
   ''' </param>
   ''' ----------------------------------------------------------------------------------------------------
   ''' <returns>
   ''' <c>True</c> if the specified object can be serialized; otherwise, <c>False</c>.
   ''' </returns>
   ''' ----------------------------------------------------------------------------------------------------
   Public Shared Function IsObjectSerializable(Of T)(ByVal obj As T,
                                                     ByVal format As SerializationFormat) As Boolean

       Dim serializer As Object = SerializationUtil.GetSerializer(obj, format)

       Using fs As New MemoryStream

           Try
               Select Case serializer.GetType

                   Case GetType(BinaryFormatter)
                       DirectCast(serializer, BinaryFormatter).Serialize(fs, obj)

                   Case GetType(XmlSerializer)
                       DirectCast(serializer, XmlSerializer).Serialize(fs, obj)

               End Select

               Return True

           Catch ex As InvalidOperationException
               Return False

           Catch ex As Exception
               Throw

           End Try

       End Using

   End Function

#End Region

End Class