Blogs CodeS-SourceS

Blogs, blogs, blogs et encore des blogs ! Ici les développeurs vous font
partager leurs expériences, trouvailles mais également des informations funs.
Bref la vie de tous les jours des développeurs pas forcément braqués sur du code !

Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide
dans Rechercher

Etape 4 : On ajoute le type correspondant à notre classe dans le session Powershell courante en spécifiant les assemblies externes nécessaires (celles qu'on a chargé dans l'étape 3)

Etape 5 : On appelle la méthode de notre code

Personnellement, cette technique m'a particulièrement été utile pour créer des scripts destinés à valider/tester un programme (appel à un web service, exécution du code d'une DLL, etc.)

Aleks's Blog

Un framework pour les dominer tous

Powershell c'est puissant ... même pour les développeurs :)

Je m'intéresse depuis quelques temps à Powershell car je dois faire des scripts pour faire installer ou migrer des systèmes que j'ai conçus/développés. J'insiste sur le "faire installer" car la plus part du temps ce n'est pas un membre de l'équipe de développement qui déploie les applications mais plutôt un membre de l'équipe de production.

PowerShell est normalement suffisamment puissant pour pouvoir faire ces tâches. Cependant, il arrive que certaines tâches requiert du code supplémentaire. Et, étant donné notre background, pourquoi ne pas faire du C# ?!

Etape 1
$resolver = @"
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace Utils
{
public static class AssemblyResolver
{
private static Dictionary<string, string> _assemblies;

static AssemblyResolver()
{
var comparer = StringComparer.CurrentCultureIgnoreCase;
_assemblies = new Dictionary<string,string>(comparer);
AppDomain.CurrentDomain.AssemblyResolve += ResolveHandler;
}

public static void AddAssemblyLocation(string path)
{
// This should be made threadsafe for production use
string name = Path.GetFileNameWithoutExtension(path);
_assemblies.Add(name, path);
}

private static Assembly ResolveHandler(object sender,
ResolveEventArgs args)
{
var assemblyName = new AssemblyName(args.Name);
if (_assemblies.ContainsKey(assemblyName.Name))
{
return Assembly.LoadFrom(_assemblies[assemblyName.Name]);
}
return null;
}
}
}
"
@

# Ajout du code C# du resolver dans la session powershell
Add-Type -TypeDefinition $resolver -Language CSharpVersion3

Etape 2
$Source = @"
using System;
using System.Windows.Forms;

namespace TestApplication
{
public class Program
{
public static string Test()
{
MessageBox.Show("
$message");

return "
OK";
}
}
}
"
@


Etape 3 : On charge les assemblies nécessaires à l'exécution du code
[Utils.AssemblyResolver]::AddAssemblyLocation("System.Windows.Forms.dll")
$Assem = @(
"System.Windows.Forms.dll"
)

# Ajout de notre code c# et de ses références dans la session powershell
Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp

$result = [TestApplication.Program]::Test()
write-host $result -foreground "green"

# Paramètre du script
Param([string]$message="toto")

# Obtenir le chemin du répertoire du script c'est toujours bon
$scriptpath = $MyInvocation.MyCommand.Path
$dir = Split-Path $scriptpath

# Code permettant de charger les assemblies en mémoire (voir un peu plus bas)
$resolver = @"
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace Utils
{
public static class AssemblyResolver
{
private static Dictionary<string, string> _assemblies;

static AssemblyResolver()
{
var comparer = StringComparer.CurrentCultureIgnoreCase;
_assemblies = new Dictionary<string,string>(comparer);
AppDomain.CurrentDomain.AssemblyResolve += ResolveHandler;
}

public static void AddAssemblyLocation(string path)
{
// This should be made threadsafe for production use
string name = Path.GetFileNameWithoutExtension(path);
_assemblies.Add(name, path);
}

private static Assembly ResolveHandler(object sender,
ResolveEventArgs args)
{
var assemblyName = new AssemblyName(args.Name);
if (_assemblies.ContainsKey(assemblyName.Name))
{
return Assembly.LoadFrom(_assemblies[assemblyName.Name]);
}
return null;
}
}
}
"
@

# Ajout du code C# du resolver dans la session powershell
Add-Type -TypeDefinition $resolver -Language CSharpVersion3

# Le code source
$Source = @"
using System;
using System.Windows.Forms;

namespace TestApplication
{
public class Program
{
public static string Test()
{
MessageBox.Show("
$message");

return "
OK";
}
}
}
"
@

# Chargement des assemblies
[Utils.AssemblyResolver]::AddAssemblyLocation("System.Windows.Forms.dll")

$Assem = @(
"System.Windows.Forms.dll"

# On peut également charger toutes les assemblies d'un répertoire !
#ForEach ( $assembly in $Assemblies)
#{
# "$dir\Assemblies\$assembly"
#}
)

# Ajout de notre code c# et de ses références dans la session powershell
Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp

$result = [TestApplication.Program]::Test()
write-host $result -foreground "green"

# On attend que l'utilisateur appuie sur une touche avant de quitter
Write-Host "Press any key to continue..." -ForegroundColor Magenta
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Publié mercredi 1 août 2012 08:46 par Aleks
Classé sous :
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29

- AutoSPInstaller pour SharePoint 2013 maintenant disponible en “RTM” par Julien Chable le 05-06-2013, 23:30


Propulsé par Community Server (Personal Edition), par Telligent Systems
Chargement...