Bonjour,
J'ai 2 questions pour le prix d'une.



Environnement :
  • Windows 10
  • Visual Studio 2019 Community
  • Framework 4.8
  • C# 8


A noter que le code est réduit à l'essentiel et que les chemins donnés sont réduits également.

Ce que je fais :
Je compile un code dynamiquement avec les outils System.CodeDom.Compiler.CodeDomProvider.CreateProvider() et System.CodeDom.Compiler.CompilerParameters().
Pour cette compilation, je pointe des dll dont j'informe le compilateur de leur chemin d'accès (C:\MesDLLs\) qui est différent du répertoire courant de mon application (C:\MonAppli\bin\Debug\).
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
CompilerParameters parameters = new CompilerParameters();
 
parameters.ReferencedAssemblies.AddRange(ReferencedAssemblies.ToArray());

ReferencedAssemblies est de type List<string> pour avoir toutes les DLLs souhaitées.

La compilation se passe bien, pas d'erreur, nickel

Maintenant, je souhaite l'exécuter avec le code suivant :
Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// La compilation
CompilerResults compil= CodeDomProvider.CreateProvider("csharp").CompileAssemblyFromSource(parameters, sourceCode);
 
// La detection d'erreur
if (compil.Errors.HasErrors)
{
    foreach (CompilerError item in Errors)
        Console.WriteLine(($"Ligne {item.Line} : {item.ErrorNumber} <=> '{item.ErrorText}'{(item.Line > 0 ? $" => '{sourceCode.Split('\n')[item.Line - 1].Trim()}'" : string.Empty)}");
 
 
    throw new Exception($"Au moins une erreur de compilation est survenu pour '{className}'.");
}
 
// L'exécution
compil.CompiledAssembly.GetType("MonType").GetMethod("MaMethode").Invoke(obj, parameters);
Et là ça crache, avec le message d'erreur suivant :

Message d'erreur => Une exception a été levée par la cible d'un appel.

Message d'erreur dans le InnerException => Impossible de charger le fichier ou l'assembly 'MaDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' ou une de ses dépendances. Le fichier spécifié est introuvable.

Et particularité de System.Reflexion.TargetInvolationException, j'ai une propriété FusionLog qui me donne tout ça =>
=== Informations d'état de liaison préalable ===
JRN*: DisplayName = MaDLL, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
JRN*: Appbase = file:///C:/MonAppli/bin/Debug/
JRN*: PrivatePath initial = NULL
Assembly appelant*: (Unknown).
===
JRN*: cette liaison démarre dans le contexte de chargement de default.
JRN*: utilisation du fichier de configuration de l'application*: C:\MonAppli\bin\Debug\MonAppli.exe.Config
JRN*: utilisation du fichier de configuration d'hôte*:
JRN*: utilisation du fichier de configuration de l'ordinateur à partir de C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
JRN*: stratégie non appliquée à la référence à ce stade (liaison d'assembly privée, personnalisée, partielle ou basée sur l'emplacement).
JRN*: tentative de téléchargement de la nouvelle URL file:///C:/MonAppli/bin/Debug/MaDLL.DLL.
JRN*: tentative de téléchargement de la nouvelle URL file:///C:/MonAppli/bin/Debug/MaDLL/MaDLL.DLL.
JRN*: tentative de téléchargement de la nouvelle URL file:///C:/MonAppli/bin/Debug/MaDLL.EXE.
JRN*: tentative de téléchargement de la nouvelle URL file:///C:/MonAppli/bin/Debug/MaDLL/MaDLL.EXE.
(Bien sûr, MonType et MaMethode n'ont pas d'erreur de frappe et existe bien dans le code fraîchement compilé)

Première question :
Pourquoi la compilation OK mais pas l'exécution ?



Après quelques heures (jours) à chercher, je teste ceci :
Je copie manuellement mes DLLs dans le répertoire C:/MonAppli/bin/Debug/ => Et là ça fonctionne

Je peux aussi ajouter une référence à ces DLLs depuis mon projet MonAppli mais cela ne me convient pas car ce sont des DLLs également compilées à la volée au début de l'exécution du programme et je ne les connais pas à l'avance (officiellement).

Première question subsidiaire :
Comment dire à mon projet d'aller voir également le répertoire C:\MesDLLS\ ?
J'ai essayé en ajoutant le chemin dans les chemins d'accès des références dans la fenêtre des propriétés du projet, cela n'a pas fonctionné
J'ai essayé en l'ajoutant au PATH système de windows pour l'ajouter, cela n'a pas fonctionné non plus...

Seconde question :
Dans le code, j'ai
Code : Sélectionner tout - Visualiser dans une fenêtre à part
int a = 1; Console.WriteLine(a.ToString("00"))
Que j'ai transformé en
Code : Sélectionner tout - Visualiser dans une fenêtre à part
int a = 1; Console.WriteLine($"{a:00}"))
Et là, à la compilation, j'ai cette erreur :
Ligne 12 : CS1056 <=> 'Caractère '$' inattendu' => 'int a = 1; Console.WriteLine($"{a:00}");'
Je n'ai pas envie de revenir au .ToString("00"), on se fait vite au sucre syntaxique... Et surtout, il y en a partout... Comment résoudre ce problème ?

Voilà, merci d'avoir lu mes questions, et encore plus d'y répondre ou de donner des pistes de recherche pour y répondre.