powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Как определить в коде, в консольном режиме работает приложение или в оконном?
25 сообщений из 43, страница 1 из 2
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445664
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть сборка, которую равно могут использовать консольные и оконные приложения. Но поведение кода должно слегка меняться в зависимости от режима - консольный или оконный процесс. Как определить режим наиболее эффективно?
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445681
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(цитата, потому что из закрытого раздела)
Сон Веры ПавловныЕсли же нужно программно, то встроенными средствами - никак, т.к. для CLR нет разницы, консольное приложение, или оконное. Тут нужно читать PE-хидер исполняемого файла. Начать можно отсюда: https://support.microsoft.com/en-us/kb/90493/en-us + https://msdn.microsoft.com/en-us/magazine/bb985997.aspx
В переводе на C# это может выглядеть примерно так (отправная точка: http://code.cheesydesign.com/?p=572):
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
public static class PeReaderExtensions
{
  // WinNT.h
  const int IMAGE_SUBSYSTEM_UNKNOWN =                   0; // Unknown subsystem.
  const int IMAGE_SUBSYSTEM_NATIVE =                    1; // Image doesn't require a subsystem.
  const int IMAGE_SUBSYSTEM_WINDOWS_GUI =               2; // Image runs in the Windows GUI subsystem.
  const int IMAGE_SUBSYSTEM_WINDOWS_CUI =               3; // Image runs in the Windows character subsystem.
  const int IMAGE_SUBSYSTEM_OS2_CUI =                   5; // image runs in the OS/2 character subsystem.
  const int IMAGE_SUBSYSTEM_POSIX_CUI =                 7; // image runs in the Posix character subsystem.
  const int IMAGE_SUBSYSTEM_NATIVE_WINDOWS =            8; // image is a native Win9x driver.
  const int IMAGE_SUBSYSTEM_WINDOWS_CE_GUI =            9; // Image runs in the Windows CE subsystem.
  const int IMAGE_SUBSYSTEM_EFI_APPLICATION =           10;
  const int IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER =   11;
  const int IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER =        12;
  const int IMAGE_SUBSYSTEM_EFI_ROM =                   13;
  const int IMAGE_SUBSYSTEM_XBOX =                      14;
  const int IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION =  16;

  public static bool IsConsoleApp()
  {
    var peHeaderReader = PeHeaderReader.GetAssemblyHeader();
    if (peHeaderReader.Is32BitHeader)
      return peHeaderReader.OptionalHeader32.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI;
    return peHeaderReader.OptionalHeader64.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CUI;
  }

  public static bool IsGuiApp()
  {
    var peHeaderReader = PeHeaderReader.GetAssemblyHeader();
    if (peHeaderReader.Is32BitHeader)
      return peHeaderReader.OptionalHeader32.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI;
    return peHeaderReader.OptionalHeader64.Subsystem == IMAGE_SUBSYSTEM_WINDOWS_GUI;
  }
}
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445684
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс. Ссылка на cheesydesign.com уже не работает. Вот этот PeHeaderReader:
PeHeaderReader.cs
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace test
{
  interface ISubsystem
  {
    UInt16 SubSystem { get; }
  }
  public class PeHeaderReader
  {
    #region File Header Structures

    public struct IMAGE_DOS_HEADER
    {      // DOS .EXE header
      public UInt16 e_magic;              // Magic number
      public UInt16 e_cblp;               // Bytes on last page of file
      public UInt16 e_cp;                 // Pages in file
      public UInt16 e_crlc;               // Relocations
      public UInt16 e_cparhdr;            // Size of header in paragraphs
      public UInt16 e_minalloc;           // Minimum extra paragraphs needed
      public UInt16 e_maxalloc;           // Maximum extra paragraphs needed
      public UInt16 e_ss;                 // Initial (relative) SS value
      public UInt16 e_sp;                 // Initial SP value
      public UInt16 e_csum;               // Checksum
      public UInt16 e_ip;                 // Initial IP value
      public UInt16 e_cs;                 // Initial (relative) CS value
      public UInt16 e_lfarlc;             // File address of relocation table
      public UInt16 e_ovno;               // Overlay number
      public UInt16 e_res_0;              // Reserved words
      public UInt16 e_res_1;              // Reserved words
      public UInt16 e_res_2;              // Reserved words
      public UInt16 e_res_3;              // Reserved words
      public UInt16 e_oemid;              // OEM identifier (for e_oeminfo)
      public UInt16 e_oeminfo;            // OEM information; e_oemid specific
      public UInt16 e_res2_0;             // Reserved words
      public UInt16 e_res2_1;             // Reserved words
      public UInt16 e_res2_2;             // Reserved words
      public UInt16 e_res2_3;             // Reserved words
      public UInt16 e_res2_4;             // Reserved words
      public UInt16 e_res2_5;             // Reserved words
      public UInt16 e_res2_6;             // Reserved words
      public UInt16 e_res2_7;             // Reserved words
      public UInt16 e_res2_8;             // Reserved words
      public UInt16 e_res2_9;             // Reserved words
      public UInt32 e_lfanew;             // File address of new exe header
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct IMAGE_DATA_DIRECTORY
    {
      public UInt32 VirtualAddress;
      public UInt32 Size;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct IMAGE_OPTIONAL_HEADER32 : ISubsystem
    {
      public UInt16 Magic;
      public Byte MajorLinkerVersion;
      public Byte MinorLinkerVersion;
      public UInt32 SizeOfCode;
      public UInt32 SizeOfInitializedData;
      public UInt32 SizeOfUninitializedData;
      public UInt32 AddressOfEntryPoint;
      public UInt32 BaseOfCode;
      public UInt32 BaseOfData;
      public UInt32 ImageBase;
      public UInt32 SectionAlignment;
      public UInt32 FileAlignment;
      public UInt16 MajorOperatingSystemVersion;
      public UInt16 MinorOperatingSystemVersion;
      public UInt16 MajorImageVersion;
      public UInt16 MinorImageVersion;
      public UInt16 MajorSubsystemVersion;
      public UInt16 MinorSubsystemVersion;
      public UInt32 Win32VersionValue;
      public UInt32 SizeOfImage;
      public UInt32 SizeOfHeaders;
      public UInt32 CheckSum;
      public UInt16 Subsystem;
      public UInt16 DllCharacteristics;
      public UInt32 SizeOfStackReserve;
      public UInt32 SizeOfStackCommit;
      public UInt32 SizeOfHeapReserve;
      public UInt32 SizeOfHeapCommit;
      public UInt32 LoaderFlags;
      public UInt32 NumberOfRvaAndSizes;

      public IMAGE_DATA_DIRECTORY ExportTable;
      public IMAGE_DATA_DIRECTORY ImportTable;
      public IMAGE_DATA_DIRECTORY ResourceTable;
      public IMAGE_DATA_DIRECTORY ExceptionTable;
      public IMAGE_DATA_DIRECTORY CertificateTable;
      public IMAGE_DATA_DIRECTORY BaseRelocationTable;
      public IMAGE_DATA_DIRECTORY Debug;
      public IMAGE_DATA_DIRECTORY Architecture;
      public IMAGE_DATA_DIRECTORY GlobalPtr;
      public IMAGE_DATA_DIRECTORY TLSTable;
      public IMAGE_DATA_DIRECTORY LoadConfigTable;
      public IMAGE_DATA_DIRECTORY BoundImport;
      public IMAGE_DATA_DIRECTORY IAT;
      public IMAGE_DATA_DIRECTORY DelayImportDescriptor;
      public IMAGE_DATA_DIRECTORY CLRRuntimeHeader;
      public IMAGE_DATA_DIRECTORY Reserved;

      public ushort SubSystem
      {
        get { return Subsystem; }
      }
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct IMAGE_OPTIONAL_HEADER64 : ISubsystem
    {
      public UInt16 Magic;
      public Byte MajorLinkerVersion;
      public Byte MinorLinkerVersion;
      public UInt32 SizeOfCode;
      public UInt32 SizeOfInitializedData;
      public UInt32 SizeOfUninitializedData;
      public UInt32 AddressOfEntryPoint;
      public UInt32 BaseOfCode;
      public UInt64 ImageBase;
      public UInt32 SectionAlignment;
      public UInt32 FileAlignment;
      public UInt16 MajorOperatingSystemVersion;
      public UInt16 MinorOperatingSystemVersion;
      public UInt16 MajorImageVersion;
      public UInt16 MinorImageVersion;
      public UInt16 MajorSubsystemVersion;
      public UInt16 MinorSubsystemVersion;
      public UInt32 Win32VersionValue;
      public UInt32 SizeOfImage;
      public UInt32 SizeOfHeaders;
      public UInt32 CheckSum;
      public UInt16 Subsystem;
      public UInt16 DllCharacteristics;
      public UInt64 SizeOfStackReserve;
      public UInt64 SizeOfStackCommit;
      public UInt64 SizeOfHeapReserve;
      public UInt64 SizeOfHeapCommit;
      public UInt32 LoaderFlags;
      public UInt32 NumberOfRvaAndSizes;

      public IMAGE_DATA_DIRECTORY ExportTable;
      public IMAGE_DATA_DIRECTORY ImportTable;
      public IMAGE_DATA_DIRECTORY ResourceTable;
      public IMAGE_DATA_DIRECTORY ExceptionTable;
      public IMAGE_DATA_DIRECTORY CertificateTable;
      public IMAGE_DATA_DIRECTORY BaseRelocationTable;
      public IMAGE_DATA_DIRECTORY Debug;
      public IMAGE_DATA_DIRECTORY Architecture;
      public IMAGE_DATA_DIRECTORY GlobalPtr;
      public IMAGE_DATA_DIRECTORY TLSTable;
      public IMAGE_DATA_DIRECTORY LoadConfigTable;
      public IMAGE_DATA_DIRECTORY BoundImport;
      public IMAGE_DATA_DIRECTORY IAT;
      public IMAGE_DATA_DIRECTORY DelayImportDescriptor;
      public IMAGE_DATA_DIRECTORY CLRRuntimeHeader;
      public IMAGE_DATA_DIRECTORY Reserved;

      public ushort SubSystem
      {
        get { return Subsystem; }
      }
    }

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct IMAGE_FILE_HEADER
    {
      public UInt16 Machine;
      public UInt16 NumberOfSections;
      public UInt32 TimeDateStamp;
      public UInt32 PointerToSymbolTable;
      public UInt32 NumberOfSymbols;
      public UInt16 SizeOfOptionalHeader;
      public UInt16 Characteristics;
    }

    // Grabbed the following 2 definitions from http://www.pinvoke.net/default.aspx/Structures/IMAGE_SECTION_HEADER.html

    [StructLayout(LayoutKind.Explicit)]
    public struct IMAGE_SECTION_HEADER
    {
      [FieldOffset(0)]
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
      public char[] Name;
      [FieldOffset(8)]
      public UInt32 VirtualSize;
      [FieldOffset(12)]
      public UInt32 VirtualAddress;
      [FieldOffset(16)]
      public UInt32 SizeOfRawData;
      [FieldOffset(20)]
      public UInt32 PointerToRawData;
      [FieldOffset(24)]
      public UInt32 PointerToRelocations;
      [FieldOffset(28)]
      public UInt32 PointerToLinenumbers;
      [FieldOffset(32)]
      public UInt16 NumberOfRelocations;
      [FieldOffset(34)]
      public UInt16 NumberOfLinenumbers;
      [FieldOffset(36)]
      public DataSectionFlags Characteristics;

      public string Section
      {
        get { return new string(Name); }
      }
    }

    [Flags]
    public enum DataSectionFlags : uint
    {
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeReg = 0x00000000,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeDsect = 0x00000001,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeNoLoad = 0x00000002,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeGroup = 0x00000004,
      /// <summary>
      /// The section should not be padded to the next boundary. This flag is obsolete and is replaced by IMAGE_SCN_ALIGN_1BYTES. This is valid only for object files.
      /// </summary>
      TypeNoPadded = 0x00000008,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeCopy = 0x00000010,
      /// <summary>
      /// The section contains executable code.
      /// </summary>
      ContentCode = 0x00000020,
      /// <summary>
      /// The section contains initialized data.
      /// </summary>
      ContentInitializedData = 0x00000040,
      /// <summary>
      /// The section contains uninitialized data.
      /// </summary>
      ContentUninitializedData = 0x00000080,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      LinkOther = 0x00000100,
      /// <summary>
      /// The section contains comments or other information. The .drectve section has this type. This is valid for object files only.
      /// </summary>
      LinkInfo = 0x00000200,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      TypeOver = 0x00000400,
      /// <summary>
      /// The section will not become part of the image. This is valid only for object files.
      /// </summary>
      LinkRemove = 0x00000800,
      /// <summary>
      /// The section contains COMDAT data. For more information, see section 5.5.6, COMDAT Sections (Object Only). This is valid only for object files.
      /// </summary>
      LinkComDat = 0x00001000,
      /// <summary>
      /// Reset speculative exceptions handling bits in the TLB entries for this section.
      /// </summary>
      NoDeferSpecExceptions = 0x00004000,
      /// <summary>
      /// The section contains data referenced through the global pointer (GP).
      /// </summary>
      RelativeGP = 0x00008000,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      MemPurgeable = 0x00020000,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      Memory16Bit = 0x00020000,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      MemoryLocked = 0x00040000,
      /// <summary>
      /// Reserved for future use.
      /// </summary>
      MemoryPreload = 0x00080000,
      /// <summary>
      /// Align data on a 1-byte boundary. Valid only for object files.
      /// </summary>
      Align1Bytes = 0x00100000,
      /// <summary>
      /// Align data on a 2-byte boundary. Valid only for object files.
      /// </summary>
      Align2Bytes = 0x00200000,
      /// <summary>
      /// Align data on a 4-byte boundary. Valid only for object files.
      /// </summary>
      Align4Bytes = 0x00300000,
      /// <summary>
      /// Align data on an 8-byte boundary. Valid only for object files.
      /// </summary>
      Align8Bytes = 0x00400000,
      /// <summary>
      /// Align data on a 16-byte boundary. Valid only for object files.
      /// </summary>
      Align16Bytes = 0x00500000,
      /// <summary>
      /// Align data on a 32-byte boundary. Valid only for object files.
      /// </summary>
      Align32Bytes = 0x00600000,
      /// <summary>
      /// Align data on a 64-byte boundary. Valid only for object files.
      /// </summary>
      Align64Bytes = 0x00700000,
      /// <summary>
      /// Align data on a 128-byte boundary. Valid only for object files.
      /// </summary>
      Align128Bytes = 0x00800000,
      /// <summary>
      /// Align data on a 256-byte boundary. Valid only for object files.
      /// </summary>
      Align256Bytes = 0x00900000,
      /// <summary>
      /// Align data on a 512-byte boundary. Valid only for object files.
      /// </summary>
      Align512Bytes = 0x00A00000,
      /// <summary>
      /// Align data on a 1024-byte boundary. Valid only for object files.
      /// </summary>
      Align1024Bytes = 0x00B00000,
      /// <summary>
      /// Align data on a 2048-byte boundary. Valid only for object files.
      /// </summary>
      Align2048Bytes = 0x00C00000,
      /// <summary>
      /// Align data on a 4096-byte boundary. Valid only for object files.
      /// </summary>
      Align4096Bytes = 0x00D00000,
      /// <summary>
      /// Align data on an 8192-byte boundary. Valid only for object files.
      /// </summary>
      Align8192Bytes = 0x00E00000,
      /// <summary>
      /// The section contains extended relocations.
      /// </summary>
      LinkExtendedRelocationOverflow = 0x01000000,
      /// <summary>
      /// The section can be discarded as needed.
      /// </summary>
      MemoryDiscardable = 0x02000000,
      /// <summary>
      /// The section cannot be cached.
      /// </summary>
      MemoryNotCached = 0x04000000,
      /// <summary>
      /// The section is not pageable.
      /// </summary>
      MemoryNotPaged = 0x08000000,
      /// <summary>
      /// The section can be shared in memory.
      /// </summary>
      MemoryShared = 0x10000000,
      /// <summary>
      /// The section can be executed as code.
      /// </summary>
      MemoryExecute = 0x20000000,
      /// <summary>
      /// The section can be read.
      /// </summary>
      MemoryRead = 0x40000000,
      /// <summary>
      /// The section can be written to.
      /// </summary>
      MemoryWrite = 0x80000000
    }

    #endregion File Header Structures

    #region Private Fields

    /// <summary>
    /// The DOS header
    /// </summary>
    private IMAGE_DOS_HEADER dosHeader;
    /// <summary>
    /// The file header
    /// </summary>
    private IMAGE_FILE_HEADER fileHeader;
    /// <summary>
    /// Optional 32 bit file header 
    /// </summary>
    private IMAGE_OPTIONAL_HEADER32 optionalHeader32;
    /// <summary>
    /// Optional 64 bit file header 
    /// </summary>
    private IMAGE_OPTIONAL_HEADER64 optionalHeader64;
    /// <summary>
    /// Image Section headers. Number of sections is in the file header.
    /// </summary>
    private IMAGE_SECTION_HEADER[] imageSectionHeaders;

    #endregion Private Fields

    #region Public Methods

    public PeHeaderReader(string filePath)
    {
      // Read in the DLL or EXE and get the timestamp
      using (FileStream stream = new FileStream(filePath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
      {
        BinaryReader reader = new BinaryReader(stream);
        dosHeader = FromBinaryReader<IMAGE_DOS_HEADER>(reader);

        // Add 4 bytes to the offset
        stream.Seek(dosHeader.e_lfanew, SeekOrigin.Begin);

        UInt32 ntHeadersSignature = reader.ReadUInt32();
        fileHeader = FromBinaryReader<IMAGE_FILE_HEADER>(reader);
        if (this.Is32BitHeader)
        {
          optionalHeader32 = FromBinaryReader<IMAGE_OPTIONAL_HEADER32>(reader);
        }
        else
        {
          optionalHeader64 = FromBinaryReader<IMAGE_OPTIONAL_HEADER64>(reader);
        }

        imageSectionHeaders = new IMAGE_SECTION_HEADER[fileHeader.NumberOfSections];
        for (int headerNo = 0; headerNo < imageSectionHeaders.Length; ++headerNo)
        {
          imageSectionHeaders[headerNo] = FromBinaryReader<IMAGE_SECTION_HEADER>(reader);
        }

      }
    }

    /// <summary>
    /// Gets the header of the .NET assembly that called this function
    /// </summary>
    /// <returns></returns>
    public static PeHeaderReader GetCallingAssemblyHeader()
    {
      // Get the path to the calling assembly, which is the path to the
      // DLL or EXE that we want the time of
      string filePath = System.Reflection.Assembly.GetCallingAssembly().Location;

      // Get and return the timestamp
      return new PeHeaderReader(filePath);
    }

    /// <summary>
    /// Gets the header of the .NET assembly that called this function
    /// </summary>
    /// <returns></returns>
    public static PeHeaderReader GetAssemblyHeader()
    {
      // Get the path to the calling assembly, which is the path to the
      // DLL or EXE that we want the time of
      string filePath = System.Reflection.Assembly.GetAssembly(typeof(PeHeaderReader)).Location;

      // Get and return the timestamp
      return new PeHeaderReader(filePath);
    }

    /// <summary>
    /// Reads in a block from a file and converts it to the struct
    /// type specified by the template parameter
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="reader"></param>
    /// <returns></returns>
    public static T FromBinaryReader<T>(BinaryReader reader)
    {
      // Read in a byte array
      byte[] bytes = reader.ReadBytes(Marshal.SizeOf(typeof(T)));

      // Pin the managed memory while, copy it out the data, then unpin it
      GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
      T theStructure = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
      handle.Free();

      return theStructure;
    }

    #endregion Public Methods

    #region Properties

    /// <summary>
    /// Gets if the file header is 32 bit or not
    /// </summary>
    public bool Is32BitHeader
    {
      get
      {
        UInt16 IMAGE_FILE_32BIT_MACHINE = 0x0100;
        return (IMAGE_FILE_32BIT_MACHINE & FileHeader.Characteristics) == IMAGE_FILE_32BIT_MACHINE;
      }
    }

    /// <summary>
    /// Gets the file header
    /// </summary>
    public IMAGE_FILE_HEADER FileHeader
    {
      get
      {
        return fileHeader;
      }
    }

    /// <summary>
    /// Gets the optional header
    /// </summary>
    public IMAGE_OPTIONAL_HEADER32 OptionalHeader32
    {
      get
      {
        return optionalHeader32;
      }
    }

    /// <summary>
    /// Gets the optional header
    /// </summary>
    public IMAGE_OPTIONAL_HEADER64 OptionalHeader64
    {
      get
      {
        return optionalHeader64;
      }
    }

    public IMAGE_SECTION_HEADER[] ImageSectionHeaders
    {
      get
      {
        return imageSectionHeaders;
      }
    }

    /// <summary>
    /// Gets the timestamp from the file header
    /// </summary>
    public DateTime TimeStamp
    {
      get
      {
        // Timestamp is a date offset from 1970
        DateTime returnValue = new DateTime(1970, 1, 1, 0, 0, 0);

        // Add in the number of seconds since 1970/1/1
        returnValue = returnValue.AddSeconds(fileHeader.TimeDateStamp);
        // Adjust to local timezone
        returnValue += TimeZone.CurrentTimeZone.GetUtcOffset(returnValue);

        return returnValue;
      }
    }

    
    #endregion Properties
  }

  public static class PeReaderExtensions
  {
    // WinNT.h
    const int IMAGE_SUBSYSTEM_UNKNOWN =                   0; // Unknown subsystem.
    const int IMAGE_SUBSYSTEM_NATIVE =                    1; // Image doesn't require a subsystem.
    const int IMAGE_SUBSYSTEM_WINDOWS_GUI =               2; // Image runs in the Windows GUI subsystem.
    const int IMAGE_SUBSYSTEM_WINDOWS_CUI =               3; // Image runs in the Windows character subsystem.
    const int IMAGE_SUBSYSTEM_OS2_CUI =                   5; // image runs in the OS/2 character subsystem.
    const int IMAGE_SUBSYSTEM_POSIX_CUI =                 7; // image runs in the Posix character subsystem.
    const int IMAGE_SUBSYSTEM_NATIVE_WINDOWS =            8; // image is a native Win9x driver.
    const int IMAGE_SUBSYSTEM_WINDOWS_CE_GUI =            9; // Image runs in the Windows CE subsystem.
    const int IMAGE_SUBSYSTEM_EFI_APPLICATION =           10;
    const int IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER =   11;
    const int IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER =        12;
    const int IMAGE_SUBSYSTEM_EFI_ROM =                   13;
    const int IMAGE_SUBSYSTEM_XBOX =                      14;
    const int IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION =  16;

    public static bool IsConsoleApp()
    {
      return CheckSubsystem(IMAGE_SUBSYSTEM_WINDOWS_CUI);
    }

    public static bool IsGuiApp()
    {
      return CheckSubsystem(IMAGE_SUBSYSTEM_WINDOWS_GUI);
    }

    static bool CheckSubsystem(int subsystem)
    {
      var hr = PeHeaderReader.GetAssemblyHeader();
      return (hr.Is32BitHeader ? (ISubsystem) hr.OptionalHeader32 : hr.OptionalHeader64).SubSystem == subsystem;
    }
  }
}

...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445686
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziktuwЕсть сборка, которую равно могут использовать консольные и оконные приложения. Но поведение кода должно слегка меняться в зависимости от режима - консольный или оконный процесс. Как определить режим наиболее эффективно?
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        private bool IsConsole()
        {
            try
            {
                var a = Console.Title;
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }

        }


говно код, за то работате :)
если из консольного проекта вызывать, вернёт True, если из WF то False
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445691
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesговно код, за то работате :)
если из консольного проекта вызывать, вернёт True, если из WF то False
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    AllocConsole();
  }

  private void button1_Click(object sender, EventArgs e)
  {
    MessageBox.Show(Console.Title); // Выводит file:///C:/Projects/.Net/_trash/tests/wf-test/wf-test/bin/Debug/wf-test.EXE
  }

  [DllImport("kernel32.dll",
    EntryPoint = "AllocConsole",
    SetLastError = true,
    CharSet = CharSet.Auto,
    CallingConvention = CallingConvention.StdCall)]
  static extern int AllocConsole();
}
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39445736
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо! Помогли.
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446024
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

я сразу сказал, что это говнокод :)
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446102
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Пускай пользователи в журнале расписываются, как они запустили
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446144
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2Пускай пользователи в журнале расписываются, как они запустилиВ системном ))
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446146
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
const int IMAGE_SUBSYSTEM_OS2_CUI = 5; // image runs in the OS/2 character subsystem.
можно запустить os/2 приложения в винде? это еще поддерживается?
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446383
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesconst int IMAGE_SUBSYSTEM_OS2_CUI = 5; // image runs in the OS/2 character subsystem.
можно запустить os/2 приложения в винде? это еще поддерживается?
Сон Веры Павловны
Код: c#
1.
  // WinNT.h


Вопрос к авторам. В хидерах SDK это все еще наличествует.
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446396
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще имхо, но такие вещи больше похожи на слабую архитектуру. Какой смысл в этом реально на столько полезный, чтоб лепить такое, а потом страдать?
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446397
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesвообще имхо, но такие вещи больше похожи на слабую архитектуру. Какой смысл в этом реально на столько полезный, чтоб лепить такое, а потом страдать?

Ну представьте себе, что вы делаете SDK, который будет использоваться в разных как в виндовых, так и в консольных приложениях. И при этом ваш SDK должен в определенных обстоятельствах выводить сообщения - в виндовом приложении в виде мессадж-бокса, а в консольном - строку в консоли.
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446410
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziktuwRoman Mejtesвообще имхо, но такие вещи больше похожи на слабую архитектуру. Какой смысл в этом реально на столько полезный, чтоб лепить такое, а потом страдать?

Ну представьте себе, что вы делаете SDK, который будет использоваться в разных как в виндовых, так и в консольных приложениях. И при этом ваш SDK должен в определенных обстоятельствах выводить сообщения - в виндовом приложении в виде мессадж-бокса, а в консольном - строку в консоли.за вывод сообщений нужно яйца оторвать, а логгеры с нормальным интерфейсом никто не отменял
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446412
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервис - это оконное или консольное Приложение?
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446418
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesconst int IMAGE_SUBSYSTEM_OS2_CUI = 5; // image runs in the OS/2 character subsystem.
можно запустить os/2 приложения в винде? это еще поддерживается?
Чего придираешься?
Из того что что-то есть в h.-хидерах еще не следует что это будет использоваться в коде.
Просто кому-то нравится переписывать/декларировать в своем модуле все константы/функции которые там есть.
Я например не сторонник подобных простыней и декларирую и выписываю только те костанты/ф-ции которые мне нужны для моего кода.

Чем хороши WIN API, всегда есть уверенность, что если используешь какую-то ф-цию, то оно будет работать и в будующих версиях виндов, чтоб они там не писали про Depricated. Прикинь ты код 20 лет назад написал (пусть даже ты его дорабатывал под новые OS), но у тебя там эта константа затесалась, а они возьмут ее и выкинут из очередного SDK/DDK. Вот по этому и не выкидывают, "обратная совместимость" так сказать.

Try..catch -это да просто, но если очень этим злоупотреблять (когда их много), то говнокод еще и тормозить будет нехило,
а API-простыни как бы мгновенно отрабатывают.

ИзопропилСервис - это оконное или консольное Приложение?
А не пофиг?
Я например часто делаю сервис как "оконное" приложение, на всяк. случай форму "скрываю", хотя ее все одно не видно, если под System. Мне к примеру удобно удерживать приложение через Application.Run(Form1), инициализировать в Form1_Load, делать какие-то заключительные процедуры в Form1_FormClosed, до кучи еще какими-нибудь таймерами кинутыми на эту форму воспользоваться и т.п. Хорошо это или плохо - мне так удобно, я так привык, кто в VB6 работал тот поймет.
Хотя вот выводить MsgBox-ы при такой "архитектуре" ясно дело не приемлимо, ибо юзеру их "не видно".
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446429
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилСервис - это оконное или консольное Приложение?
Оконное:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC>dumpbin /headers D:\Projects\.Net\_tests\Printing.NET\FileSpooler\bin\Debug\FileSpooler.exe
Microsoft (R) COFF/PE Dumper Version 10.00.40219.01
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file D:\Projects\.Net\_tests\Printing.NET\FileSpooler\bin\Debug\FileSpooler.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        59033409 time date stamp Fri Apr 28 17:22:33 2017
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             102 characteristics
                   Executable
                   32 bit word machine

OPTIONAL HEADER VALUES
             10B magic # (PE32)
           11.00 linker version
            2200 size of code
             800 size of initialized data
               0 size of uninitialized data
            40CE entry point (004040CE)
            2000 base of code
            6000 base of data
          400000 image base (00400000 to 00409FFF)
            2000 section alignment
             200 file alignment
            4.00 operating system version
            0.00 image version
            4.00 subsystem version
               0 Win32 version
            A000 size of image
             200 size of headers
               0 checksum
               2 subsystem (Windows GUI)
            8540 DLL characteristics
                   Dynamic base
                   NX compatible
                   No structured exception handler
                   Terminal Server Aware
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446434
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziktuwRoman Mejtesвообще имхо, но такие вещи больше похожи на слабую архитектуру. Какой смысл в этом реально на столько полезный, чтоб лепить такое, а потом страдать?

Ну представьте себе, что вы делаете SDK, который будет использоваться в разных как в виндовых, так и в консольных приложениях. И при этом ваш SDK должен в определенных обстоятельствах выводить сообщения - в виндовом приложении в виде мессадж-бокса, а в консольном - строку в консоли.
Представьте себе есть у меня такой SDK, используется и в виндовых, и в консольных, и в веб приложениях.
И сообщения в последних прекрасно выводятся без какого-либо определения режима.

Рассказать как? :)
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446435
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилСервис - это оконное или консольное Приложение?
Веб :)
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446511
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Чего придираешься?В каком месте я придираюсь к объявлению? если константа определена как private или protected на крайняк, я не против, только за ) мне вообще в целом интересно, возможно ли запустить приложение os/2 на совр. виндовс
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446545
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

В приведенном коде (насколько я глянул) реально используется только 2 константы из списка.
IMAGE_SUBSYSTEM_WINDOWS_CUI
IMAGE_SUBSYSTEM_WINDOWS_GUI

Автор же как человек аккуратный задекларировал весь список (хотя спрашивается нафига выписывать то, что никогда не понадобится). Но такова была обычная практика в том же самом VB6.
На самом деле это еще и лишнее, потому как все эти ненужные декларации "компилируются",
вот здесь озадачивался этим вопросом.
Как при компиляции "удалить из exe-шника" декларированные, но не используемые API?
Оно как бы не жалко, но может например увеличить число претензий со стороны антивирусных поделок.

Ну а твой интерес, какое отношение к вопросу имеет.
Я лично про OS/2 особо никогда не интересовался, первые компы были с Win95/98 и так понимаю на тот момент OS/2 уж ушла в сторону и была не шибко актуальна. Но судя по википедии
https://ru.wikipedia.org/wiki/OS/2
Win отделился от OS/2, отсюда понятно происхождение констант в SDK, не более.
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446602
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
skyANAРассказать как? :)
Расскажи. У меня есть нечто подобное и мне интересно как другие решают.

У меня чисто классы, которые считают и вызовы этих классов в разных приложениях.
Классы входят в приложения через "Добавить как связь"
Можно было бы и в DLL запихать, но у меня ограничение - программы должны состоять из одного файла
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446603
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перепробовав разные варианты, надежно сработал такой вариант (и под дебагером, и без):

Код: c#
1.
2.
3.
4.
5.
6.
7.
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetConsoleWindow();

        private static bool IsConsoleMode()
        {
            return GetConsoleWindow() != IntPtr.Zero;
        }
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446663
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я вызову AllocConsole в оконном приложении этот говнокод решит что моё приложение консольное?
...
Рейтинг: 0 / 0
C# Как определить в коде, в консольном режиме работает приложение или в оконном?
    #39446708
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилЕсли я вызову AllocConsole в оконном приложении этот говнокод решит что моё приложение консольное?
ИМХО правильно решит. Есть консоль - есть куда выводить.
...
Рейтинг: 0 / 0
25 сообщений из 43, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# Как определить в коде, в консольном режиме работает приложение или в оконном?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]