Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. Ngen on setup, VB to C# translation

Ngen on setup, VB to C# translation

Scheduled Pinned Locked Moved C#
csharpvisual-studiocomtutorial
15 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • G Giorgi Dalakishvili

    Yes, it looks like a P/Invoke signature. Did you try converting it to c# yourself?

    #region signature my articles #endregion

    B Offline
    B Offline
    Bekjong
    wrote on last edited by
    #6

    Ok, I actually got it to compile using: [DllImport("mscoree.dll")] static extern int GetCORSystemDirectory( [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] StringBuilder buffer, Int32 buffer_length, out Int32 length ); And then calling the function like this: System.Text.StringBuilder Path = new System.Text.StringBuilder(1024); int Size; GetCORSystemDirectory(Path, Path.Capacity, out Size); Still doesn't seem to be working though, can you tell me if the signature is right?

    Standards are great! Everybody should have one!

    G 1 Reply Last reply
    0
    • B Bekjong

      [Message Deleted]

      G Offline
      G Offline
      Giorgi Dalakishvili
      wrote on last edited by
      #7

      In the original there is System.Text.StringBuilder, why did you change it with just String? If you've never worked with P/Invoke, I suggest you have a look at this: P/Invoke[^]

      #region signature my articles #endregion

      B 1 Reply Last reply
      0
      • G Giorgi Dalakishvili

        In the original there is System.Text.StringBuilder, why did you change it with just String? If you've never worked with P/Invoke, I suggest you have a look at this: P/Invoke[^]

        #region signature my articles #endregion

        B Offline
        B Offline
        Bekjong
        wrote on last edited by
        #8

        You're absolutely right. Should have noticed that. Take a look at my second try (below) please.

        Standards are great! Everybody should have one!

        1 Reply Last reply
        0
        • B Bekjong

          Ok, I actually got it to compile using: [DllImport("mscoree.dll")] static extern int GetCORSystemDirectory( [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)] StringBuilder buffer, Int32 buffer_length, out Int32 length ); And then calling the function like this: System.Text.StringBuilder Path = new System.Text.StringBuilder(1024); int Size; GetCORSystemDirectory(Path, Path.Capacity, out Size); Still doesn't seem to be working though, can you tell me if the signature is right?

          Standards are great! Everybody should have one!

          G Offline
          G Offline
          Giorgi Dalakishvili
          wrote on last edited by
          #9

          You should also have notices that original code uses System.Runtime.InteropServices.UnmanagedType.LPWStr and not System.Runtime.InteropServices.UnmanagedType.LPStr Also, third parameter of GetCORSystemDirectory Function is DWORD* so you should pass a reference to int.

          #region signature my articles #endregion

          B 1 Reply Last reply
          0
          • G Giorgi Dalakishvili

            You should also have notices that original code uses System.Runtime.InteropServices.UnmanagedType.LPWStr and not System.Runtime.InteropServices.UnmanagedType.LPStr Also, third parameter of GetCORSystemDirectory Function is DWORD* so you should pass a reference to int.

            #region signature my articles #endregion

            B Offline
            B Offline
            Bekjong
            wrote on last edited by
            #10

            Ok, thanks for the advice I've updated the code to:

            [DllImport("mscoree.dll")]
            static extern int GetCORSystemDirectory(
            [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] StringBuilder buffer,
            Int32 buffer_length,
            ref Int32 length
            );

            And the call is now like this:

            // Gets the path to the Framework directory.
            System.Text.StringBuilder Path = new System.Text.StringBuilder(1024);
            int Size = 0;
            GetCORSystemDirectory(Path, Path.Capacity, ref Size);

            Still it's not working :(. If I could only set a breakpoint to find out why, but this doesn't seem to be supported for installer projects...

            Standards are great! Everybody should have one!

            G 1 Reply Last reply
            0
            • B Bekjong

              Ok, thanks for the advice I've updated the code to:

              [DllImport("mscoree.dll")]
              static extern int GetCORSystemDirectory(
              [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] StringBuilder buffer,
              Int32 buffer_length,
              ref Int32 length
              );

              And the call is now like this:

              // Gets the path to the Framework directory.
              System.Text.StringBuilder Path = new System.Text.StringBuilder(1024);
              int Size = 0;
              GetCORSystemDirectory(Path, Path.Capacity, ref Size);

              Still it's not working :(. If I could only set a breakpoint to find out why, but this doesn't seem to be supported for installer projects...

              Standards are great! Everybody should have one!

              G Offline
              G Offline
              Giorgi Dalakishvili
              wrote on last edited by
              #11

              Are you getting an error/exception or is it returning wrong data? Did you turn the stringbuilder into string?

              #region signature my articles #endregion

              B 1 Reply Last reply
              0
              • G Giorgi Dalakishvili

                Are you getting an error/exception or is it returning wrong data? Did you turn the stringbuilder into string?

                #region signature my articles #endregion

                B Offline
                B Offline
                Bekjong
                wrote on last edited by
                #12

                I'm on Vista and getting code 2869, no further explanation. I've googled it for a bit and now suspect it's a security problem. This would mean the p/invoke call is actually good now. This is the code:

                using System;
                using System.Collections.Generic;
                using System.ComponentModel;
                using System.Configuration.Install;
                using System.Runtime.InteropServices;
                using System.Text;
                using System.Diagnostics;

                namespace InstallationHelper
                {
                [RunInstaller(true)]
                public partial class InstallationHelper : Installer
                {
                [DllImport("mscoree.dll")]
                static extern int GetCORSystemDirectory(
                [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] StringBuilder buffer,
                Int32 buffer_length,
                ref Int32 length
                );

                    public InstallationHelper()
                    {
                        InitializeComponent();
                    }
                
                    \[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)\]
                    public override void Install(System.Collections.IDictionary savedState)
                    {
                        base.Install(savedState);
                        string Args = this.Context.Parameters\["Args"\];
                
                        if (Args == "")
                        {
                            throw new InstallException("No arguments specified");
                        }
                
                        // Gets the path to the Framework directory.
                        System.Text.StringBuilder Path = new System.Text.StringBuilder(1024);
                        int Size = 0;
                        GetCORSystemDirectory(Path, Path.Capacity, ref Size);
                
                        Process P;
                        // Quotes the arguments, in case they have a space in them.
                        ProcessStartInfo Si = new ProcessStartInfo(Path.ToString() + "ngen.exe", "\\"" + Args + "\\"");
                        Si.WindowStyle = ProcessWindowStyle.Maximized;
                        try
                        {
                            P = Process.Start(Si);
                            P.WaitForExit();
                        }
                        catch (Exception e)
                        {
                            throw new InstallException(e.Message);
                        }
                    }
                
                
                }
                

                }

                Standards are great! Everybody should have one!

                G 1 Reply Last reply
                0
                • B Bekjong

                  I'm on Vista and getting code 2869, no further explanation. I've googled it for a bit and now suspect it's a security problem. This would mean the p/invoke call is actually good now. This is the code:

                  using System;
                  using System.Collections.Generic;
                  using System.ComponentModel;
                  using System.Configuration.Install;
                  using System.Runtime.InteropServices;
                  using System.Text;
                  using System.Diagnostics;

                  namespace InstallationHelper
                  {
                  [RunInstaller(true)]
                  public partial class InstallationHelper : Installer
                  {
                  [DllImport("mscoree.dll")]
                  static extern int GetCORSystemDirectory(
                  [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] StringBuilder buffer,
                  Int32 buffer_length,
                  ref Int32 length
                  );

                      public InstallationHelper()
                      {
                          InitializeComponent();
                      }
                  
                      \[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)\]
                      public override void Install(System.Collections.IDictionary savedState)
                      {
                          base.Install(savedState);
                          string Args = this.Context.Parameters\["Args"\];
                  
                          if (Args == "")
                          {
                              throw new InstallException("No arguments specified");
                          }
                  
                          // Gets the path to the Framework directory.
                          System.Text.StringBuilder Path = new System.Text.StringBuilder(1024);
                          int Size = 0;
                          GetCORSystemDirectory(Path, Path.Capacity, ref Size);
                  
                          Process P;
                          // Quotes the arguments, in case they have a space in them.
                          ProcessStartInfo Si = new ProcessStartInfo(Path.ToString() + "ngen.exe", "\\"" + Args + "\\"");
                          Si.WindowStyle = ProcessWindowStyle.Maximized;
                          try
                          {
                              P = Process.Start(Si);
                              P.WaitForExit();
                          }
                          catch (Exception e)
                          {
                              throw new InstallException(e.Message);
                          }
                      }
                  
                  
                  }
                  

                  }

                  Standards are great! Everybody should have one!

                  G Offline
                  G Offline
                  Giorgi Dalakishvili
                  wrote on last edited by
                  #13

                  Yes, according to google it looks like a problem with permissions and vista. You could try running it on XP or calling unmanaged function from a normal windows application so that you can set breakpoint.

                  #region signature my articles #endregion

                  B 1 Reply Last reply
                  0
                  • G Giorgi Dalakishvili

                    Yes, according to google it looks like a problem with permissions and vista. You could try running it on XP or calling unmanaged function from a normal windows application so that you can set breakpoint.

                    #region signature my articles #endregion

                    B Offline
                    B Offline
                    Bekjong
                    wrote on last edited by
                    #14

                    Ok, problem solved! Cleaning up seems to be the right thing to do here: Just removing the constructor was enough to get the thing going for some reason :). Thanks a bunch Giorgi, you've been a real help!

                    Standards are great! Everybody should have one!

                    G 1 Reply Last reply
                    0
                    • B Bekjong

                      Ok, problem solved! Cleaning up seems to be the right thing to do here: Just removing the constructor was enough to get the thing going for some reason :). Thanks a bunch Giorgi, you've been a real help!

                      Standards are great! Everybody should have one!

                      G Offline
                      G Offline
                      Giorgi Dalakishvili
                      wrote on last edited by
                      #15

                      Glad to help you :)

                      #region signature my articles #endregion

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups