2015-08-25 7 views
5

में डब्ल्यूपीएफ और कमांडलाइन ऐप मैं एक एकल निष्पादन योग्य फ़ाइल चाहता हूं जिसे मैं या तो ग्राफिकल ऐप खोलने के लिए उपयोग कर सकता हूं (डिफ़ॉल्ट उपयोग केस, .exe पर क्लिक करते समय), या जिसका उपयोग मैं कर सकता हूं रन कमांड लाइन कार्यों।वही निष्पादन योग्य

क्या यह संभव है?

यदि हां, तो मुझे अपने app.xaml/app.xaml.cs को कैसे संशोधित करना होगा, इसलिए यह केवल विशिष्ट स्थितियों पर ग्राफिकल दृश्य खोलता है (उदा। कोई कमांडलाइन पैरामीटर नहीं)?

+0

आप कमांड लाइन मोड इंगित करने के लिए ध्वज पास कर सकते हैं और जब मौजूद हो, तो अपने ऐप को कंसोल पर अटैच करने के लिए अटैचकंसोल का उपयोग करें। Http: //www.codeproject देखें।कॉम/टिप्स/68 9 7 9/अटैचिंग-ए-कंसोल-टू-ए-विनफॉर्म-एप्लिकेशन और उदाहरण – user469104

उत्तर

5

सबसे पहले आपको एक WPF अनुप्रयोग प्रोजेक्ट का उपयोग करना होगा और app.xml को बदलना होगा ताकि आप विंडो निर्माण को ओवरराइड कर सकें।

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

नोट यह StartupUri संपत्ति अनुपलब्ध है।

फिर, पर अपने App.xaml.cs आप कुछ इस तरह कर सकते हैं:

public partial class App : Application 
    { 
     protected override void OnStartup(StartupEventArgs e) 
     { 
      base.OnStartup(e); 

      if (condition) 
      { 
       var window = new MainWindow(); 

       window.ShowDialog(); 
      } 
      else 
      { 
       AllocConsole(); 
      } 
     } 

     [DllImport("Kernel32.dll")] 
     static extern void AllocConsole(); 
    } 
2

आप देख सकते हैं कि आवेदन एक कंसोल से मार डाला गया है। यदि नहीं, तो आप एक सांत्वना गतिशील आवंटित कर सकते हैं:

if (GetConsoleWindow() == IntPtr.Zero) 
    AllocConsole(); 

जहां

[DllImport("kernel32.dll")] 
public static extern IntPtr GetConsoleWindow(); 

[DllImport("kernel32.dll")] 
public static extern bool AllocConsole(); 
+0

यदि ऐप को कंसोल से शुरू किया गया है लेकिन कोई कमांडलाइन पैराम नहीं मिला है, तो भी मैं विंडो खोलना चाहता हूं .... – Wilbert

+0

बस ऐसा करें। :) आपको पहले कमांड लाइन पैरामीटर को जांचना होगा। वैसे भी, एक कंसोल आवंटित करने से पहले आप यह जांच सकते हैं कि ऐप में पहले से ही एक है या नहीं। – taffer

2

@ BrunoKlein के जवाब में काम करेंगे, और मैं उसके समाधान पर मेरा उत्तर आधारित। उद्धरण @ ब्रूनोक्लेन,

सबसे पहले आपको एक WPF अनुप्रयोग प्रोजेक्ट का उपयोग करना होगा और app.xaml को बदलना होगा ताकि आप विंडो निर्माण को ओवरराइड कर सकें।

<Application x:Class="WpfApplication1.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:local="clr-namespace:WpfApplication1"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

नोट इस StartupUri संपत्ति याद आ रही है।

अब, यहां तक ​​कि सरल (यह कम से कम विजुअल स्टूडियो 2015 में काम करता है), प्रोजेक्ट गुणों पर जाएं, और आउटपुट प्रकार को विंडोज एप्लिकेशन से कंसोल एप्लिकेशन में बदलें। यह प्रोजेक्ट को कंसोल ऐप के रूप में बनाता है, लेकिन अभी भी विंडोज़ एप्लीकेशन की क्षमता है।

Windows Application (कक्षा लाइब्रेरी इस फोटो में प्रकाश डाला है, कंसोल अनुप्रयोग का चयन बजाय)

तुमने किया! किया हुआ।

अब, बजाय एक void Main(string[] args) होने के लिए, अपने "मुख्य" विधि अपने स्वत: जनरेट की App वर्ग के OnStautup विधि है:

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 
     string[] args = e.Args; 

     if (SomeConditionBasedOnTheArgs(args)) 
     { 
      // Instantiate view, call View.Show() 
     } 
     else 
     { 
      // Process the args 
     } 
    } 
} 

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

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