2012-03-28 13 views
2

Ich habe ein natives Spiel von Drittanbietern, mit dem ich native Erweiterungen dafür schreiben kann, indem ich eine bestimmte Funktion in eine native DLL exportiert. Ich habe dies verwendet, um die CLR mit C++/CLI-Compiler-generierten Hosting-Code zu hosten, so dass ich C# -Code aus dem Spiel aufrufen kann. Das hat gut funktioniert und es ist eine sehr elegante Lösung.Hosting CLR und programmgesteuert zur Verfügung stellen app.config?

Sobald die CLR durch das Spiel geladen wird, sucht es game.exe.config im Spiel ausführbaren Ordner, für die weitere .NET-Assembly Prüfinformation:

<?xml version="1.0"?> 
<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="@Arma2NET"/> 
    </assemblyBinding> 
    </runtime> 
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup></configuration> 

Diese willkürliche Konfigurationsdatei meine Ordnerstruktur bricht; Ich möchte, dass mein Projekt im Ordner @Arma2NET eigenständig ist und keine zufälligen Konfigurationsdateien im Spielordner hat. Im Moment ist es aufgrund der Ordneranforderungen des Spiels unmöglich, die Projektdateien im selben Ordner wie die native CLR-Hosting-DLL zu haben.

Gibt es eine Möglichkeit, die CLR mit dieser Konfiguration programmgesteuert aus nativem Code bereitzustellen, wenn sie gestartet wird, ohne den gesamten CLR-Hostingcode selbst zu schreiben?

Antwort

1

Ich landete das AssemblyResolve Ereignis mit .NET zu sagen, wo den Rest meiner Baugruppen zu finden:

Assembly^ ResolveAssembly(Object ^sender, ResolveEventArgs ^e) 
    { 
     String ^directory = Path::GetDirectoryName(Assembly::GetExecutingAssembly()->Location); 
     AssemblyName ^assemblyName = gcnew AssemblyName(e->Name); 
     for each (String ^extension in gcnew array<String^> { ".dll", ".exe" }) 
     { 
      String ^fileName = Path::Combine(directory, assemblyName->Name + extension); 
      try 
      { 
       return Assembly::LoadFile(fileName); 
      } 
      catch (...) 
      { 
      } 
     } 
     return nullptr; 
    } 
0

Wie Sie ändern Sie die app.config in der Bibliothek Projekt erstellen Aktion auf "Embedded Resource" dann verwenden Sie etwas wie ConfigurationManager.OpenMappedExeConfiguration, um es zu lesen.

+0

Das glaube ich nicht, dass ich das tun kann, wie die CLR derjenige sein wird, um die Konfiguration zu lesen , nicht mein Programm. – Scott

Verwandte Themen