2017-10-23 3 views
2

Ich habe vor kurzem nach einer Möglichkeit zur Verwendung einer nicht registrierten DLL in VBScript gesucht. This akzeptierte Antwort besagt, dass es unter Verwendung GetObject erreicht werden kann vorausgesetzt, dass (das in den Kommentaren von der Person, die die Antwort gab) die DLL eine COM-Schnittstelle verfügbar macht. Ich habe noch nie in C# programmiert, aber ich wollte es versuchen, da die Antwort für diese Sprache war. Nach einiger Suche habe ich das folgende Codebeispiel auf this Seite gefunden:VBScript - Verwenden Sie nicht registrierte DLL

using System; 
using System.Runtime.InteropServices; 

namespace Tester 
{ 
    [Guid("D6F88E95-8A27-4ae6-B6DE-0542A0FC7039")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
    public interface _Numbers 
    { 
     [DispId(1)] 
     int GetDay(); 

     [DispId(2)] 
     int GetMonth(); 

     [DispId(3)] 
     int GetYear(); 

     [DispId(4)] 
     int DayOfYear(); 
    } 

    [Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] 
    [ClassInterface(ClassInterfaceType.None)] 
    [ProgId("Tester.Numbers")] 
    public class Numbers : _Numbers 
    { 
     public Numbers() { } 

     public int GetDay() 
     { 
      return (DateTime.Today.Day); 
     } 

     public int GetMonth() 
     { 
      return (DateTime.Today.Month); 
     } 

     public int GetYear() 
     { 
      return (DateTime.Today.Year); 
     } 

     public int DayOfYear() 
     { 
      return (DateTime.Now.DayOfYear); 
     } 
    } 
} 

mit Visual Studio 2010 Professional, habe ich eine neue C# Klassenbibliothek und es Tester genannt. Ich habe den obigen Code in die Standarddatei Class1.cs kopiert und kompiliert. Dann machte ich eine VBS-Datei mit dem folgenden Code:

Option Explicit 

Dim Obj 

' This part gives the following error message: 
' ActiveX component can't create object: 'GetObject' 
Set Obj = GetObject("C:\MyFolderPath\Tester.dll", "Tester.Numbers") 
MsgBox Obj.GetDay 

jedoch der Code einen Fehler warf und würde das Objekt nicht instanziiert. Ich habe versucht, die .vbs-Datei auf der 32 und 64-Bit-Version von wscript.exe zu laufen, weil ich auf Windows 7 64 Bit bin. Aber der Fehler war beide Male der gleiche. Also, muss ich etwas im C# -Code ändern und/oder einige andere Optionen, die ich in Visual Studio ändern muss, oder ist der Anspruch der Person in der verknüpften Antwort einfach falsch?

EDIT 1

Meine Frage ist kein Duplikat von this ein. Ich erkenne, dass die Anfrage von ähnlicher Natur ist. Meine Frage hat jedoch mit der Beweislast zu tun. Nilpo hat angegeben, dass GetObject es VBScript ermöglichen wird, ein Objekt mit einer nicht registrierten C# -DLL zu instanziieren, solange es eine COM-Schnittstelle verfügbar macht und sogar seine Position in derselben Frage verteidigt. Ich habe mein Bestes getan, um die von ihm beschriebene Methode anzuwenden, und war nicht erfolgreich. Also, wenn es möglich ist, würde ich gerne ein einfaches Arbeitsbeispiel sehen. Und wenn nicht, hatte ich gehofft, eine Art Dokumentation zu sehen, warum nicht.

Außerdem werde ich gerne eine andere Programmiersprache verwenden, wenn das wirklich die einzige Möglichkeit ist, die von mir gesuchte Funktionalität zuzulassen. Daher habe ich C# aus meinem Fragentitel entfernt und das C# -Tag entfernt.

EDIT 2

Ich reparierte die Syntax für den ursprünglichen C# -Code Hervorhebung ich gepostet. Es ist abgebrochen, nachdem ich das C# -Tag von der Frage in meinem ersten Schnitt entfernt habe.

+1

Überprüfen Sie in den Projekteigenschaften des C# -Projekts auf der Registerkarte "Build" "Register for COM interop". –

+0

@ OlivierJacot-Descombes Leider haben wir keinen Administrator-Zugang zu unseren PCs bei der Arbeit, so dass die Registrierung der DLL keine Option ist. –

+1

Zuerst habe ich es gesehen. Dies wäre technisch möglich, wenn es sich um eine normale COM-DLL, eine mit einem DllGetClassObject() -Export und eine eingebettete Typbibliothek handeln würde. Dies gilt auch für eine mit C# erstellte DLL. Eine solche Entwicklung ohne Administratorzugriff auf die Dev-Maschine zu machen, ist nicht praktikabel. Ich nehme an, du könntest mit der Option Regasm.exe/regfile weiterschleichen und die generierte REG-Datei editieren, indem du HKLM durch HKCU ersetzt, aber das wird in Eile schmerzhaft. Eine benutzerdefinierte [ComRegisterFunction], die in HKCU registriert wird, ist praktischer, aber schwer zu bekommen. –

Antwort

-1

Sie befinden sich auf dem richtigen Pfad, aber dieser CodeProject-Link erwartet, dass Sie die Bibliothek mit COM registrieren, für die erhöhte Rechte erforderlich sind.

Wenn Sie jedoch die ComVisible attribute zu der Klasse hinzufügen, die Sie veröffentlichen möchten, sollten Sie nach dem Kompilieren der DLL in der Lage sein, sie über GetObject() aufzurufen.

[Guid("13FE32AD-4BF8-495f-AB4D-6C61BD463EA4")] 
[ClassInterface(ClassInterfaceType.None)] 
[ProgId("Tester.Numbers")] 
[ComVisible(true)] 
public class Numbers : _Numbers 
{ 
    public Numbers() { } 

    public int GetDay() 
    { 
     return (DateTime.Today.Day); 
    } 

    public int GetMonth() 
    { 
     return (DateTime.Today.Month); 
    } 

    public int GetYear() 
    { 
     return (DateTime.Today.Year); 
    } 

    public int DayOfYear() 
    { 
     return (DateTime.Now.DayOfYear); 
    } 
} 
+0

Ich habe gerade versucht, die Änderung, die Sie gebucht und erhalten haben der genau gleiche Fehler, wenn ich die .vbs-Datei ausgeführt habe. –

+0

@ChrisD Sie sind sicher, dass Sie es kompiliert haben * (fresh build) * für 32 Bit und lief Ihr VBScript über das 32-Bit-Subsystem oder umgekehrt? – Lankymart

+0

Ich weiß, dass mein Visual Studio-Programm 32 Bit ist und ich bin mir ziemlich sicher, dass die DLL standardmäßig im 32-Bit-Modus kompiliert wird. Ich habe definitiv keine Einstellungen gesehen oder geändert, um das 64-Bit-Kompilieren zu ermöglichen. Und ich habe sichergestellt, dass die .vbs-Datei sowohl in der 32- als auch in der 64-Bit-Version von wscript.exe getestet wird. –

Verwandte Themen