2009-04-27 8 views
9

पर संदर्भ जोड़ें मैं CodeDomProvider कक्षा का उपयोग कर रन-टाइम पर कक्षाओं को संकलित कर रहा हूं। यह कक्षाएं केवल System नाम स्थान का उपयोग कर के लिए ठीक काम करता है:कंपाइलर पैरामीटर। संदर्भित एस्सेम्ब्लीज - System.Web.UI.WebControls

{error CS0006: Metadata file 'System.Web.UI.WebControls' could not be found} System.CodeDom.Compiler.CompilerError

यहाँ मेरी कोड का एक टुकड़ा है::

using System; 

public class Test 
{ 
    public String HelloWorld() 
    { 
     return "Hello World!"; 
    } 
} 

अगर मैं हालांकि System.Web.UI.WebControls का उपयोग कर एक वर्ग को संकलित करने का प्रयास करें, मैं इस त्रुटि मिलती है

var cp = new CompilerParameters(); 

cp.ReferencedAssemblies.Add("System.Web.UI.WebControls"); 

मैं System.Web.UI.WebControls नामस्थान का संदर्भ कैसे दूं?

उत्तर

14

आप असेंबली का संदर्भ देते हैं, नामस्थान नहीं। इस मामले में यह होने वाला है:: आप MSDN विधानसभा कि कक्षाएं आप उपयोग करने की आवश्यकता है उसका नाम को देखने के लिए उपयोग करना चाहिए

var cp = new CompilerParameters(); 
cp.ReferencedAssemblies.Add("System.Web.dll"); 
+0

मेरे लिए काम नहीं करता है। क्या आपको लगता है कि मुझे असेंबली के लिए पूरा रास्ता देना चाहिए? अगर हाँ; मैं गतिशील रूप से कैसे कर सकता हूं? – roosteronacid

+3

आह, System.Web.UI.WebControls.dll मौजूद नहीं है - उस नामस्थान में कक्षाएं System.Web.dll में रहते हैं। –

39

आप कर सकते हैं सभी वर्तमान में लोड विधानसभाओं के माध्यम से लूप:

var assemblies = AppDomain.CurrentDomain 
          .GetAssemblies() 
          .Where(a => !a.IsDynamic) 
          .Select(a => a.Location); 

cp.ReferencedAssemblies.AddRange(assemblies.ToArray()); 
+0

क्यों प्रयास करें/पकड़ें जब कहीं भी (ए =>! ए.आईएसडैनेमिक) ऐसा करेगा? – epitka

+0

मेरा मूल उत्तर .net 2.0 के साथ काम करता था जो कि मैंने कोड लिखा था जब मैं उपयोग कर रहा था। न तो LINQ और न ही विधानसभा। गतिशील संपत्ति .NET 2.0 में मौजूद है। –

+3

ध्यान दें कि यह AddRange नहीं जोड़ता है (ठीक होगा लेकिन <6 char संपादित नहीं कर सकता)। – phillipwei

5

यह मेरे मामले में थोड़ा कम क्रूर बल साबित हुआ। मैं एक एडिन बना रहा था और वर्तमान डोमेन में 730 असेंबली लोड की गई थी, इसलिए इसमें बड़ी अंतराल शामिल थी।

var assemblies = someType.Assembly.GetReferencedAssemblies().ToList(); 
    var assemblyLocations = 
assemblies.Select(a => 
    Assembly.ReflectionOnlyLoad(a.FullName).Location).ToList(); 

assemblyLocations.Add(someType.Assembly.Location); 

cp.ReferencedAssemblies.AddRange(assemblyLocations.ToArray()); 
+1

+1। मैंने आपके प्रस्ताव का इस्तेमाल किया और बहुत अच्छा काम किया। बस आपको अंतिम पंक्ति को संपादित करने और 'cp.ReferencedAssemblies.AddRange (assemblyLocations.ToArray()) लिखने की आवश्यकता है; इसके बजाए। –

संबंधित मुद्दे