2012-11-25 14 views
5

मैं पता लगा मैं एक और आसानी से से एक स्क्रिप्ट लाइब्रेरी लोड नहीं कर सकते हैं:Roslyn स्क्रिप्ट फ़ाइल से संदर्भित स्क्रिप्ट पुस्तकालयों को कैसे लोड करें?

module.csx

string SomeFunction() { 
    return "something"; 
} 

script.csx

ExecuteFile("module.csx"); 
SomeFunction() <-- causes compile error "SomeFunction" does not exist 

इसका कारण यह है संकलक मॉड्यूल के बारे में पता नहीं है। सीएसएक्स जब यह script.csx afaiu संकलित करता है। मैं उस से दो फाइलों को लोड करने के लिए एक और स्क्रिप्ट जोड़ सकता हूं, और यह काम करेगा। हालांकि वह सुंदर नहीं है।

इसके बजाय मैं अपनी स्क्रिप्ट के भीतर एक विशेष वाक्यविन्यास "लोड मॉड्यूल" के लिए अपनी स्क्रिपथोस्ट जांच करना चाहता हूं, और वास्तविक स्क्रिप्ट निष्पादन से पहले उन मॉड्यूल को निष्पादित करना चाहता हूं।

script.csx

// load "module.csx" 
SomeFunction() 
अब

, कुछ बुनियादी स्ट्रिंग से निपटने के साथ, मैं जो (लाइनों कि // लोड होता है ...) लोड करने के लिए मॉड्यूल यह पता लगाने और (यहाँ सार https://gist.github.com/4147064) लोड फ़ाइलें कर सकते हैं :

foreach(var module in scriptModules) { 
    session.ExecuteFile(module); 
} 
return session.Execute(script) 

लेकिन - हम रोसलिन बात कर रहे हैं के बाद से, वहाँ वाक्य रचना मैं तलाश कर रहा हूँ के लिए स्क्रिप्ट पार्स करने के लिए कुछ अच्छा तरीका है, है ना होना चाहिए?

और यह कोड के मॉड्यूल पुस्तकालयों को संभालने का एक तरीका भी हो सकता है?

+0

:

#load "common.csx" ... 

और स्रोत समाधानकर्ता कॉन्फ़िगर जब आप स्क्रिप्ट चलाने पूरी बात का पहला संस्करण: https://github.com/joeriks/RoslynWebScript – joeriks

उत्तर

6

वर्तमान में रोज़लिन में एक और स्क्रिप्ट फ़ाइल का संदर्भ देने का कोई तरीका नहीं है। हम #load को भाषा का एक हिस्सा होने के लिए इंटरेक्टिव विंडो के होस्ट कमांड होने से आगे बढ़ने पर विचार कर रहे हैं (जैसे #r), लेकिन वर्तमान में इसे लागू नहीं किया गया है।

तारों से निपटने के तरीके के रूप में, आप इसे सामान्य रूप से पार्स कर सकते हैं, और उसके बाद पूर्व-प्रोसेसर निर्देशों को देखें जो अज्ञात प्रकार के हैं और इस तरह संरचना में पहुंचे हैं।

+0

धन्यवाद, इसलिए मैं अपने ओ के लिए वाक्यविन्यास पेड़ का विश्लेषण करूंगा निर्देश निर्देश (उदाहरण के लिए # लोड), और उसके बाद उस निर्देश के बिना एक नया पेड़ बनाएं, और नए पेड़ को निष्पादित करें? या क्या मुझे बेहतर तरीके से संकलन का उपयोग करना चाहिए। स्क्रिप्ट ... स्क्रिप्टिंग निष्पादन के बजाय? – joeriks

+0

पेड़ को फिर से लिखना और फिर एक उचित योजना की तरह ध्वनि निष्पादित करना। –

4

स्क्रिप्ट फ़ाइलों में #load के लिए समर्थन https://github.com/dotnet/roslyn/commit/f1702c के रूप में जोड़ा गया है।

यह कार्यक्षमता दृश्य स्टूडियो में उपलब्ध हो जाएगा 2015 अपडेट 1.

1

स्क्रिप्ट को शामिल करें:

Script<object> script = CSharpScript.Create(code, ...); 
var options = ScriptOptions.Default.WithSourceResolver(new SourceFileResolver(new string[] { }, baseDirectory)); 
var func = script.WithOptions(options).CreateDelegate() 
...