2011-02-15 17 views
6

में परिभाषित एक प्रकार के लिए WPF टूलबॉक्स इंस्टॉलर मैं एक WPF नियंत्रण के लिए एक VSIX इंस्टॉलर बनाने की कोशिश कर रहा हूं।एक अलग असेंबली

यह माना जाता है कि आसान है, लेकिन "आसान" संस्करण मानता है कि आप VSIX प्रोजेक्ट में WPF नियंत्रण बनाते हैं।

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

एक विकल्प कोड मैं नियंत्रण के विधानसभा में टूलबॉक्स में इसे स्थापित करने की जरूरत है स्थानांतरित करने के लिए होगा, लेकिन है कि Microsoft.VisualStudio.Shell.Immutable.10.0.dll करने के लिए एक निर्भरता जोड़ना होगा। असेंबली दोनों को विजुअल स्टूडियो के साथ इस्तेमाल किया जाता है, और एक रिमोट सर्वर एक सेवा के भीतर चल रहा है जहां वीएस स्थापित नहीं है, इसलिए यह कोई नहीं है।

मैंने कोशिश की एक और विकल्प टूलबॉक्स इंस्टॉलर VSIX को प्रॉक्सी पर पंजीकरण एट्रिब्यूट लागू करके "अन्य" असेंबली में परिभाषित प्रकारों को पंजीकृत करेगा। सोचा कि यह काम करेगा, लेकिन अजीब चीजें हुईं।

all kinds of weirdness in the toolbox

इसके बजाय दो नियंत्रण होने का, मैं अजीब तरह से नामित टैब, जिनमें से कुछ मेरी नामस्थान के कुछ गूंज में सीमा नियंत्रण का एक गुच्छा (मानक WPF सीमा) मिलता है।

जब मैं वीएसआईएक्स के अलावा किसी असेंबली में नियंत्रण परिभाषित करता हूं तो मैं टूलबॉक्स के साथ एक WPF UserControl कैसे पंजीकृत कर सकता हूं?

+0

यह धारणा कहां है कि डब्ल्यूपीएक्स प्रोजेक्ट में डब्ल्यूपीएफ नियंत्रण होना चाहिए? इसके अलावा, "आसान" संस्करण से आपका क्या मतलब है? – Matt

+1

@ मैट: कोई धारणा नहीं, उपकरण कैसे डिज़ाइन किए गए हैं। यदि आप एमएसडीएन walkthroughs [यहां] (http://msdn.microsoft.com/en-us/library/ee712573.aspx) का पालन करते हैं और [यहां] (http://msdn.microsoft.com/en-us/library/ee712574।एएसपीएक्स) या बस स्थापित टेम्पलेट को देखें, आप देखेंगे कि यह उसी प्रोजेक्ट में इंस्टॉलर और नियंत्रण के संयोजन के लिए तैयार है (ट्यूटोरियल और टेम्पलेट)। या, आप बस मेरे प्रश्न का उत्तर देने का प्रयास कर सकते हैं, इस मामले में आप पाएंगे कि यह किसी भी अन्य तरीके से * आसान * कुछ भी नहीं है। – Will

+0

@ क्या मुझे लगता है कि मैं आपका पॉइंट देखता हूं, ऐसा लगता है कि ProvideToolboxControl विशेषता निर्भरता है जिसके बारे में आप बात करते हैं? – Matt

उत्तर

2

मैं आपके द्वारा वर्णित प्रॉक्सी विचार के समान अवधारणा का सबूत चाबुक करने में सक्षम था।

जो समस्या आप देख रहे हैं वह गलत असेंबली के पंजीकरण के कारण है, इसलिए मैंने ProvideProxyToolboxControlAttribute नामक एक नई पंजीकरण विशेषता बनाई है जिसका उपयोग आपके वीएस एकीकरण असेंबली में प्रॉक्सी कक्षाओं पर एक विशेषता के रूप में किया जाता है। यह लगभग ProvideToolboxControlAttribute के समान है, सिवाय इसके कि यह वास्तविक नियंत्रण का प्रकार लेता है। बेशक, यह नई विशेषता आपके वीएस असेंबली में भी होगी।

उदाहरण के लिए, मैं अपने गैर वी.एस. विधानसभा MyToolboxControl कहा जाता है में एक टूलबॉक्स नियंत्रण है कहते हैं, मैं अपने वी.एस. विधानसभा में एक साधारण प्रॉक्सी वर्ग MyToolboxControlProxy बनाएंगे कि इस तरह दिखता है:

[ProvideProxyToolboxControl("MyToolboxControl", typeof(NonVsAssembly.MyToolboxControl))] 
public class ToolboxControlProxy 
{ 
} 

और निश्चित रूप से , जादू ProvideProxyToolboxControlAttribute में होता है, जो मूल रूप से सिर्फ इस वर्ग (टिप्पणियों और पैरामीटर/त्रुटि संक्षिप्तता के लिए हटाया जाँच) है:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)] 
[System.Runtime.InteropServices.ComVisibleAttribute(false)] 
public sealed class ProvideProxyToolboxControlAttribute : RegistrationAttribute 
{ 
    private const string ToolboxControlsInstallerPath = "ToolboxControlsInstaller"; 
    public ProvideProxyToolboxControlAttribute(string name, Type controlType) 
    { 
     this.Name = name; 
     this.ControlType = controlType; 
    } 

    private string Name { get; set; } 

    private Type ControlType { get; set; } 

    public override void Register(RegistrationAttribute.RegistrationContext context) 
    { 
     using (Key key = context.CreateKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}", 
                 ToolboxControlsInstallerPath, 
                 ControlType.AssemblyQualifiedName))) 
     { 
      key.SetValue(String.Empty, this.Name); 
      key.SetValue("Codebase", ControlType.Assembly.Location); 
      key.SetValue("WPFControls", "1"); 
     } 
    } 
    public override void Unregister(RegistrationAttribute.RegistrationContext context) 
    { 
     if (context != null) 
     { 
      context.RemoveKey(String.Format(CultureInfo.InvariantCulture, "{0}\\{1}", 
                 ToolboxControlsInstallerPath, 
                 ControlType.AssemblyQualifiedName)); 
     } 
    } 
} 

यह अच्छी तरह से काम करने लगता है, मैं सत्यापित है कि नियंत्रण पिटारे में और वह यह है कि जनसंपर्क ऑपरेट रजिस्ट्री कुंजी जोड़ा गया था।

आशा है कि इससे मदद मिलती है!

+0

इस पर मदद के लिए धन्यवाद। इससे पहले कि मैं वास्तव में इसे रोल कर सकता हूं और देख सकता हूं कि यह मेरे लिए काम करता है या नहीं। – Will

+0

इसे कुछ महीने या उससे अधिक बनाएं ... – Will

+0

@ क्या मैं कुछ साल कहूंगा। – TechNyquist

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