2014-04-07 30 views
6

Dinamik kodu çalıştırmak için CS-Script kütüphanesini kullanıyorum. Bir betik motoru olarak kullanmak yerine, işlevselliği anında bir uygulamaya takmak için kullanmak istiyorum. İşteC# Komut Dosyası Referansı Nasıl Eklenir

using System; 
using System.Windows.Forms; 

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

Bu iyi çalışır ... ...

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(); 
     } 
    } 
} 

barındıran kod Ve burada SomeCode/MyScript.cs içeriğini var. Barındırma kodunda, barındırma kodunun montaj referanslarını belirtmekten sorumlu olmasını istemiyorum. Bu yüzden CSScript.Evaluator.ReferenceAssembly(Assembly.GetAssembly(typeof(System.Windows.Forms.MessageBox))); açıklama ve çalıştırın ve ben ...

hata CS0234 hatası alıyorum: tür veya ad alanı adı Forms' does not exist in the namespace System.Windows'. Bir montaj referansı eksik misiniz?

Ben başvuru eklemek için Senaryonun en üstüne bu ekleyebilirsiniz komut satırı araçlarını kullanarak bu yürütme olsaydı Biliyorum ...

//css_reference System.Windows.Forms.dll 

Ama bu çalıştırırken göz ardı gibi görünüyor bir .NET uygulaması bağlamında. Referansları doğru bir şekilde çözmek için nasıl alabilirim?

+0

// css_reference için teşekkürler, bunu nasıl yapacağını anlayamadım! – Nile

cevap

3

Şekil verilmiş.

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

Otomatik olarak bunu yapmadığına şaşırdım.

+0

Otomatik olarak da yapmadığı için çok ilgilenirim. Bulmak için ilk buraya geliyor :-) – Askolein

0

Bunu başka bir şekilde çözdüm, "Yerel Kopyala" özelliğini kullanmak için gerekli başvurulan derlemelerimi true olarak ayarladım ve komutlarımı yüklemeden önce bunları Değerlendiricime yükledim.

Bunu, komut dosyalarını daha hızlı yükleyerek yüklenen derlemeleri önceden derleyip saklayacağından bunu yapmanızı öneririm. Her defasında bir betik yüklediğinizde, GAC'den ya da başka bir yerden başvurulan derlemeleri aramak yerine, sadece bunları içerir ve komut dosyasını olabildiğince verimli bir şekilde yüklemeye devam eder. "Bağımlılık yerel yolu" projenizde herhangi başvurulan derleme "Açıklama" dizesi olarak bulunabilir başvurulan nesnenin sadece adıdır

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

.

İlgili konular