Laden...

C# Methode über vbscript auf einem 64 Bit System aufrufen

Erstellt von T-Man vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.014 Views
T
T-Man Themenstarter:in
210 Beiträge seit 2006
vor 14 Jahren
C# Methode über vbscript auf einem 64 Bit System aufrufen

Moin zusammen!

Ich bastele gerade mit Advanced Installer einen neuen Installer für mein Produkt. Vorher hatte ich einen selbst gebauten, der nicht Windows Installer benutzte. Nun habe ich eine Aufwendigere Custom Action in C# geschrieben, da ich weder c++ noch vbscript beherrsche. Die dll ist ComVisible und wird mit regasm registriert. Mit einem einfachen VBScript rufe ich nun die c#-Methode auf.

Script: Session.Property("OLDAPPLICATIONPATH") = CreateObject("InstallationTool.InstallationTool").GetOldApplicationPath()

Auf 32 Bit Systemen funktioniert es wunderbar.

Nun versuche ich das selbe auf einem 64 Bit System.
Im Advanced Installer gibt es bei der Custom Action eine CheckBox "64 Bit Script"
Wenn ich dieses setzte bekomme ich einen Fehler. InstallationTool.InstallationTool kann nicht erstellt werden.
Wenn ich das Häkchen nicht setze, gibt es keinen Fehler, aber die Funktion liefert nicht das zurück was sie sollte. Sie liefert null statt des Pfades, der in der Registry steht...

Ich habe dann eben schnell zum Test in c# eine Consolen Anwendung geschrieben, die die Methode (GetOldApplicationPath()) aufruft und das Ergebnis auf der Console ausgibt. Wenn ich dieses ausführe, bekomme ich das erwünschte Ergebnis.

Wieso klappt es mit VBScript nicht? Was läuft falsch, bzw. was muss ich anders machen?

Hier eben noch der Code der GetOldApplicationPath:

        public string GetOldApplicationPath()
        {
            string path = null;
            using (RegistryKey softwareKey = Registry.LocalMachine.OpenSubKey("Software"))
                if (softwareKey != null)
                    using (RegistryKey dpKey = softwareKey.OpenSubKey("DocuPortal.NET"))
                        if (dpKey != null)
                            using (RegistryKey verKey = dpKey.OpenSubKey("Version"))
                                if (verKey != null)
                                {
                                    using (RegistryKey volKey = verKey.OpenSubKey("VOL8"))
                                        if (volKey != null)
                                            foreach (string v8Instance in volKey.GetSubKeyNames())
                                                using (RegistryKey instKey = volKey.OpenSubKey(v8Instance))
                                                    if (instKey != null)
                                                    {
                                                        var val = instKey.GetValue("ApplicationPath");
                                                        if (val != null)
                                                            path = val.ToString();
                                                        if (Directory.Exists(path))
                                                        {
                                                            instKey.Close();
                                                            break;
                                                        }
                                                        path = null;
                                                    }
                                    if (path == null)
                                        using (RegistryKey volKey = verKey.OpenSubKey("VOL7"))
                                            if (volKey != null)
                                                foreach (string v7Instance in volKey.GetSubKeyNames())
                                                    using (RegistryKey instKey = volKey.OpenSubKey(v7Instance))
                                                        if (instKey != null)
                                                        {
                                                            var val = instKey.GetValue("ApplicationPath");
                                                            if (val == null) continue;
                                                            path = val.ToString();
                                                            if (Directory.Exists(path))
                                                            {
                                                                string dllPath = Path.Combine(Path.Combine(path, "bin"), "data.dll");
                                                                if (File.Exists(dllPath))
                                                                {
                                                                    var fvi = System.Diagnostics.FileVersionInfo.GetVersionInfo(dllPath);
                                                                    if (fvi.ProductBuildPart >= 1235) break;
                                                                }
                                                            }
                                                            path = null;
                                                        }
                                }
            if (path != null) path = Path.GetDirectoryName(path);
            return path;
        }

Vielen Dank schon Mal im voraus für eventuelle Hilfe.
Gruß T-Man