2011-06-04 7 views
5

मैं आयरनपीथॉन स्क्रिप्ट से सी # कक्षा का उपयोग कैसे करूं? सी #:आयरनपीथन लिपि से एक्सेस होस्ट क्लास

public class MyClass 
{ 
} 

public enum MyEnum 
{ 
    One, Two 
} 

var engine = Python.CreateEngine(options); 
var scope = engine.CreateScope(); 
scope.SetVariable("t", new MyClass()); 
var src = engine.CreateScriptSourceFromFile(...); 
src.Execute(scope); 

IronPython स्क्रिप्ट:

class_name = type(t).__name__  # MyClass 
class_module = type(t).__module__ # __builtin__ 

# So this supposed to work ... 
mc = MyClass() # ??? 
me = MyEnum.One # ??? 

# ... but it doesn't 

अद्यतन

मैं एक होस्टिंग विधानसभा में परिभाषित वर्गों आयात करने के लिए की जरूरत है।

उत्तर

3

आप एक उदाहरण MyClass की को t निर्धारित किया है, लेकिन आप इसे उपयोग करने के लिए जैसे कि यह वर्ग ही थे कोशिश कर रहे हैं।

आपको या तो अपनी आयरनपीथन लिपि में से MyClass आयात करने की आवश्यकता होगी, या किसी प्रकार की फैक्ट्री विधि इंजेक्ट करें (क्योंकि कक्षाएं सी # में प्रथम श्रेणी की वस्तुएं नहीं हैं, इसलिए आप MyClass सीधे पास नहीं कर सकते हैं)। वैकल्पिक रूप से, आप typeof(MyClass) में पास कर सकते हैं और उदाहरण के लिए System.Activator.CreateInstance(theMyClassTypeObject) का उपयोग कर सकते हैं।

चूंकि आप का उपयोग करने की जरूरत है MyEnum (आप कहाँ से आ सकते हैं के लिए किसी भी संदर्भ के बिना अपनी स्क्रिप्ट में यह प्रयोग कर रहे हैं पर ध्यान दें), मैं सिर्फ उपयोग करने का सुझाव आयात:

import clr 
clr.AddReference('YourAssemblyName') 

from YourAssemblyName.WhateverNamespace import MyClass, MyEnum 

# Now these should work, since the objects have been properly imported 
mc = MyClass() 
me = MyEnum.One 

आप खेलने के लिए हो सकता है स्क्रिप्ट स्रोत प्रकार के साथ (मुझे लगता है कि File सर्वोत्तम काम करता है) और सफल होने के लिए clr.AddReference() कॉल प्राप्त करने के लिए स्क्रिप्ट निष्पादन पथ।

+0

मैं बाहरी असेंबली से कक्षा आयात कर सकता हूं। लेकिन मुझे होस्टिंग असेंबली से कक्षा का उपयोग करने की आवश्यकता है। वह जो पाइथन लिपि शुरू करता है। मैंने आयात के साथ खेलने की कोशिश की है, लेकिन ऐसा करने का कोई तरीका नहीं मिला। – Max

+0

@ मैक्स: होस्टिंग असेंबली किसी भी तरह से विशेष नहीं है - आपको किसी भी अन्य असेंबली से जैसे ही आयात करना होगा। आप अपने डीएलएल को 'AddReference()' कॉल में पूर्ण, पूर्ण पथ डाल सकते हैं - यदि यह काम करता है, तो आप जानते हैं कि यह केवल एक पथ/वर्तमान निर्देशिका समस्या है (जो परेशान हो सकता है, लेकिन कम से कम आपको पता चलेगा कि कोड काम करता है या नहीं) – Cameron

+0

चूंकि स्क्रिप्ट होस्ट किया जा रहा था, मुझे यकीन था कि मुझे होस्टिंग असेंबली आयात करने की आवश्यकता नहीं है। और अब मैंने कोशिश की है कि मैं देख रहा हूं कि यह काम कर रहा है। यह अजीब बात है कि जब मैंने कक्षा के उदाहरण को पारित किया और कक्षा का नाम और मॉड्यूल पूछताछ की, ऐसा लगता है कि कक्षा पहले ही वैश्विक नामस्थान का हिस्सा है। – Max