Ich habe eine Website, die auf Benutzeranforderung kompiliert eine Klasse im laufenden Betrieb und legt die DLL (namens Equation.dll) in einem Unterverzeichnis der Website. Der Administrator kann jederzeit neu kompilieren. Sobald jedoch eine Instanz der Klasse erstellt wurde, wird die Meldung "Der Prozess kann nicht auf die Datei zugreifen, weil sie von einem anderen Prozess verwendet wird" angezeigt.Verwenden einer AppDomain zum Instanziieren einer Klasse in einer DLL
Wie ich es verstehe, ist der einzige Weg um Instanzen aus einer anderen AppDomain zu erstellen. Das nächste Mal, dass der Administrator neu kompilieren muss, muss ich diese AppDomain entladen und (denke ich) alles wird gut. (Vielleicht ist meine Annahme falsch?)
Ehrlich gesagt kann ich keine Instanz dieser Klasse erstellen, um mein Leben zu retten. Zugegeben, ich bin hier ein bisschen über meinen Kopf hinweg ... also schwinge ich bei allem. Mein Schnipsel an diesem Punkt ist:
AppDomainSetup ads = new AppDomainSetup();
ads.PrivateBinPath = HttpContext.Current.Server.MapPath("~/equationcache/");
ads.ApplicationBase = HttpContext.Current.Server.MapPath("~/equationcache/");
AppDomain appDomain = AppDomain.CreateDomain("EquationDomain", null, ads);
Object wrapper = appDomain.CreateInstance("Equation, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null", "Cnn.CostModel.Business.CalculationEngine");
Der „equationcache“ Ordner ist, wo die DLL kompiliert wird (obwohl ich versucht habe, setzen diese in „ist“ zum Spaß, und kein Erfolg entweder). Der Assemblyname im Aufruf scheint korrekt zu sein (und funktioniert mit einer appDomain.Load). Der Typname in dem Aufruf scheint korrekt zu sein. Gemäß dem Protokoll, geschieht Folgendes:
=== Pre-bind state information ===
LOG: User = xxx\xxx
LOG: DisplayName = Cnn.CostModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
(Fully-specified)
LOG: Appbase = file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/
LOG: Initial PrivatePath = C:\Users\xxx\Documents\Visual Studio 2008\Projects\ACnnCostModel\CnnCostModels\equationcache\Calling assembly : Equation, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null.
LOG: This bind starts in default load context.
LOG: No application configuration file found.
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\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/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel.DLL.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel/Apa.CostModel.DLL.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel.EXE.
LOG: Attempting download of new URL file:///C:/Users/xxx/Documents/Visual Studio 2008/Projects/CnnCostModel/CnnCostModels/equationcache/Cnn.CostModel/Cnn.CostModel.EXE.
Ich verstehe nicht, warum es für verschiedene Formen von „Cnn.CostModel“ im „equationcache“ Verzeichnis. Zugegebenermaßen lebt der aufrufende Code in der "Cnn.CostModel.dll" im bin-Ordner. Was muss ich tun, um die Datei "Equation.dll" abzurufen?
Oder bin ich einfach völlig von der Basis auf dieses Unterfangen? Sehr frustriert. Jede Hilfe wäre sehr geschätzt.
ich in den MEF ... Dank aussehen werden! –