Powershell 2.0-Runtime-Ausnahme: konnte nicht geladen, Datei oder assembly
Dem Szenario, das ich bin versucht zu korrigieren, ist eine, in welche dlls gefunden werden, wenn C# wird kompiliert, aber nicht gefunden, wenn der c# - code ausgeführt wird. Dies ist die Powershell 2.0. Unsere Politik ist, nicht über das GAC. Der c# - code in eine Powershell-Funktion ist ähnlich wie diese:
function functionDef
{
[System.Reflection.Assembly]::LoadFrom("c:\myDir\func1.dll")
[System.Reflection.Assembly]::LoadFrom("c:\myDir\func2.dll")
$ref = @("c:\myDir\func1.dll","c:\myDir\func2.dll")
$cCode = @"
using System;
using func1;
using func2;
namespace serializedDef
{
public class defSerialization
{
public defSerialization () {}
<#
method and properyty defs not included
#>
public double setSpec {
set { computeDef(value)}
get {return spefDef}
}
private double computeDef ( double value)
{
<# calls to methods in DLLS loaded above
#>
}
}
}
"@
add-type -ReferencedAssemblies $ref -TypeDefinition $cCode -passthru - Language CSharpVersion3 | out-null
}
Wenn diese Funktion aufgerufen wird, die den c# - code kompiliert wird mit Fehler,.
Füge ich den Pfad zu den beiden referenzierten DLLS, um die $env:path Wert. Es ist ein 3rd-party-DLL-DLL-Pfad installiert an einem anderen Ort; dieser Weg ist auch Hinzugefügt, um die $env:path. Die Berechtigungen für beide Wege sind weit offen für jedermann zu Testzwecken.
Ich dann die Instanz der C# - code als neues Objekt:
$myObject = new-object serializedDef.defSerialization
Wenn ich zum aufrufen der Funktion:
$myObject.setSpec = 35.5
Bekomme ich die Fehlermeldung:
Exception setting "setSpec": "Could not load file or assmbly
'func1', Version=1.0.0.0, Culture=neutral, PublicKeyToken=f0a7c34216660f47' or one of its dependencies. The system cannot find the file specified."
At line:1 char:11
+ $myObject. <<< setSpec = 35.5
+ CategogyInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifedErrorId : PropertyAssignmentException
Mein Verständnis ist, dass der Fehler wahrscheinlich bezieht sich auf eine Methode oder ähnliches, die eine Dll verweist, die nicht gefunden werden kann. Wie kann ich das aufspüren?
- Mit fusglow ich die Fehlermeldung wird darauf hingewiesen, wie 'Bindung an native image Montage nicht erfolgreich. Verwenden IL Bild'. Vage verstehen die Botschaft, aber nicht wissen, wie Sie die Implementierung der änderungen erforderlich.
Du musst angemeldet sein, um einen Kommentar abzugeben.
.NET-Assemblys werden nicht geladen, aus dem Weg. Die app-base-dir ist das PowerShell-install-dir-und Sie nicht wirklich wollen, kopieren Sie Ihre Versammlungen. Ich empfehle Einhaken der Anwendungsdomäne.AssemblyResolve-Ereignis. Dieses Ereignis wird aufgerufen, wenn die CLR nicht finden können, eine Montage, an dieser Stelle können Sie den vollständigen Pfad der assembly in Frage. Blick auf diese SO ein post für mehr info.
Ich modellierte eine Lösung nach der Veröffentlichung verwiesen wird in der Antwort eines (Wie kann ich PowerShell Hinzugefügt-Typen zu verwenden, Hinzugefügt Typen). Es funktioniert perfekt auf beiden x87-und x64-Plattformen. Dankeschön.