2014-04-07 9 views
6

Używam biblioteki CS-Script do uruchamiania kodu dynamicznego. Zamiast używać go jako silnika skryptów, chcę go użyć do podłączenia funkcjonalności do aplikacji w locie. Oto kod gospodarzem ...Jak dodać odniesienie do skryptu w języku C#

using System; 
using CSScriptLibrary; 
using System.Reflection; 
using System.IO; 

namespace CSScriptTester 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // http://www.csscript.net/ 
      Console.WriteLine("Running Script."); 
      CSScript.Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(System.Windows.Forms.MessageBox))); 
      string code = File.ReadAllText("SomeCode/MyScript.cs"); 
      dynamic block = CSScript.Evaluator.LoadCode(code); 
      block.ExecuteAFunction(); 
      Console.WriteLine("Press any key to exit."); 
      Console.ReadKey(); 
     } 
    } 
} 

A oto zawartość SomeCode/MyScript.cs ...

using System; 
using System.Windows.Forms; 

namespace CSScriptTester.SomeCode 
{ 
    class MyScript 
    { 
     public void ExecuteAFunction() 
     { 
      MessageBox.Show("Hello, world!"); 
     } 
    } 
} 

To działa prawidłowo. W kodzie hostingu nie chcę, aby kod hostingu był odpowiedzialny za określenie referencji zespołu. Więc wykomentuj CSScript.Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(System.Windows.Forms.MessageBox))); i uruchomić go i pojawia się błąd ...

error CS0234: Typ lub obszaru nazw Forms' does not exist in the namespace System.Windows'. Brakuje odniesienia do zespołu?

wiem jakbym wykonanie tego za pomocą narzędzi wiersza poleceń mogę dodać to na początku skryptu, aby dodać odniesienie ...

//css_reference System.Windows.Forms.dll 

ale to wydaje się być ignorowane podczas wykonywania to w kontekście aplikacji .NET. Jak mogę go naprawić, aby poprawnie rozwiązać referencje?

+0

Dzięki za wzmiankę o // css_reference, nie mogłem wymyślić, jak to zrobić! – Nile

Odpowiedz

3

Wyliczyłem to.

string code = File.ReadAllText("SomeCode/MyScript.cs"); 
CSScript.Evaluator.ReferenceAssembliesFromCode(code);  
dynamic block = CSScript.Evaluator.LoadCode(code); 
block.ExecuteAFunction(); 

Jestem zaskoczony, że nie robi tego automatycznie.

+0

Byłbym bardzo zainteresowany tym, że nie robi tego również automagicznie. Pierwszy, który się dowie, wraca tutaj :-) – Askolein

0

Rozwiązałem to w inny sposób, ustawiłem potrzebne zbiory z referencjami "Kopiuj lokalnie" na true i wczytaj je do mojego Evaluatora, zanim załaduję moje skrypty.

Zalecam wykonanie tej czynności, ponieważ będzie ona wstępnie kompilować i przechowywać załadowane zespoły, przyspieszając ładowanie skryptów ad-hoc. Zamiast przeszukiwać przywoływane zespoły z GAC lub gdzie indziej za każdym razem, gdy ładujesz skrypt, po prostu je posiada i zajmuje się ładowaniem skryptu tak wydajnie, jak to tylko możliwe.

CSScript.Evaluator.ReferenceAssembly("<local path to dependency>.dll"); 
IScript script = CSScript.Evaluator.LoadFile<IScript>("<local path to script file"); 

gdzie „ścieżka lokalna do Dependency” to tylko nazwa odwołuje się przedmiotu, który można znaleźć jako „Opis” ciąg jakiegokolwiek odwołania zgromadzenia w projekcie.

Powiązane problemy