Konnte nicht geladen, Datei oder assembly
Habe ich eine einfache ausführbare Datei, ich möchte eine dll in. Ich habe es als Referenz. Ich habe eine app.config-Datei, weil die dll ist letztendlich nicht, werde in die ausführbare Datei ein Verzeichnis. Wenn ich mein Programm ausführen aus der IDE, alles ist fein, b/c, die die dll kopiert wird, ist es lokal, aber sobald ich ziehe meine ausführbare Datei aus, es stürzt ab. Meine fusion-Protokoll impliziert es, dass es die angegebene Datei nicht gefunden.
Meiner Main () - Methode:
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
Assembly assembly = null;
String dllLocation = @"C:\BMS_ACTD\bin\DX\Tools\BmsReplayAnalysis.dll";
IToolsInterface myProgram = null; //from ToolsInterface.dll
try
{
assembly = Assembly.LoadFrom(dllLocation);
}
catch
{
}
foreach (Type myType in assembly.GetTypes())
{
if (myType.GetInterface(typeof(IToolsInterface).FullName) != null)
{
myProgram = (IToolsInterface)assembly.CreateInstance(myType.Namespace + "." + myType.Name, true);
myProgram.RunTool();
break;
}
}
Hier ist meine config Datei:
<runtime>
<dependentAssembly>
<assemblyIdentity name="ToolsInterface" publicKeyToken="null" culture="neutral" />
<codeBase version="1.0.0.0" href="file://C:/BMS_ACTD/bin/DX/Globals/ToolsInterface.dll"/>
</dependentAssembly>
</runtime>
Möchte ich nicht haben, um sorgen machen starke benennen. Ich habe nur 1 version der dll, und das ist alles, was ich kümmern.
hier der Auszug aus der fusionlog:
The operation failed.
Bind result: hr = 0x80070002. The system cannot find the file specified.
Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Running under executable C:\Users\greenj\Desktop\BmsReplayLauncher.exe
--- A detailed error log follows.
=== Pre-bind state information ===
LOG: User = BMS-JMGREEN\greenj
LOG: DisplayName = ToolsInterface, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///C:/Users/greenj/Desktop/
LOG: Initial PrivatePath = NULL
LOG: Dynamic Base = NULL
LOG: Cache Base = NULL
LOG: AppName = BmsReplayLauncher.exe
Calling assembly : BmsReplayLauncher, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Users\greenj\Desktop\BmsReplayLauncher.exe.Config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind).
LOG: Attempting download of new URL file:///C:/Users/greenj/Desktop/ToolsInterface.DLL.
LOG: Attempting download of new URL file:///C:/Users/greenj/Desktop/ToolsInterface/ToolsInterface.DLL.
LOG: Attempting download of new URL file:///C:/Users/greenj/Desktop/ToolsInterface.EXE.
LOG: Attempting download of new URL file:///C:/Users/greenj/Desktop/ToolsInterface/ToolsInterface.EXE.
LOG: All probing URLs attempted and failed.
program.exe
=> program.exe.config
?Ich muss zu formulieren, die ursprüngliche Frage basierend auf Ihrer Antwort. Ich hatte die falsche config (hatte das vshost-version). Having said that, das ist meine Frage, aktualisiert in einer Sekunde.
InformationsquelleAutor Jason | 2011-07-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dinge immer knifflig .net, wenn Sie versuchen zu laden aus einem Ordner, der gar nicht in den Ordner oder Unterordner der Anwendung EXE-Datei die Lage. Ich würde empfehlen, versuchen, zwei Dinge. Verwenden Sie zuerst die
<probing>
- Attribut, um anzugeben, wo Sie zu suchen für Ihre benutzerdefinierte DLL finden Sie in diesem Antwort, anstatt, wie Sie es tun.Zweiten, wenn das nicht funktioniert, versuchen Sie es mit der AppDomain.AssemblyResolve-Ereignis statt mit Ihrem config-Datei. Sie können dann laden Sie die assembly aus, wo immer Sie wollen.
Bearbeiten: Jay Walker weist darauf hin, dass NET ..4 und höher geändert haben AssemblyResolve so, dass wenn die DLL ein, die nicht im Ordner "custom", null zurückgeben, behalten Sie die Standardeinstellung.
Hier einige Beispiel-code für AssemblyResolve:
Das ist richtig, das ist der Grund, warum ich die Anwendungsdomäne.AssemblyResolve-Methode (ich war nicht sicher, wo Ihre app residierte).
Ich legte das assemblyresolve-auch als erste Zeile in meinem code in der Main, aber ich bin abstürzt, noch bevor ich um es zu bekommen.
Sind Sie Verweis auf die DLL in einem statischen Konstruktor oder statischen Initialisierer?
das ist jetzt zu korrigieren; es war eine änderung in der 4.0-framework nicht richtig an der Zeit meiner Antwort. Vielen Dank für den Hinweis auf die änderung, es macht AssemblyResolve viel einfacher zu schreiben.
InformationsquelleAutor Ed Bayiates
Zitieren MSDN für
<codebase>
:Assembly keinen starken Namen, so dass Sie können nicht verwenden Sie diese Richtlinie, indem Sie einen vollständigen Pfad anzugeben. Melden Sie Ihre Versammlung (es dauert drei Klicks mit Visual Studio) oder verwenden Sie
AssemblyResolve
wie vorgeschlagen von AresAvatar.depends.exe sagt, es sind 2 dlls nicht finden kann. gpsvc.dll und ieshims.dll. Es gibt ein paar stellen, um zu Klagen über dieses Problem. Ich weiß wirklich nicht, ob das ist das eigentliche problem oder nicht, aber die Leute haben nicht wirklich eine Lösung für Sie. Hier ist die andere Sache, wenn ich mein Programm zum kopieren von lokalen für die Werkzeuge, die interface-dll, und führen Sie es aus der IDE, habe ich kein problem. So WTF???
InformationsquelleAutor Julien Lebosquain