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.
Überprüfen Sie in den Projekteigenschaften des C# -Projekts auf der Registerkarte "Build" "Register for COM interop". –
@ OlivierJacot-Descombes Leider haben wir keinen Administrator-Zugang zu unseren PCs bei der Arbeit, so dass die Registrierung der DLL keine Option ist. –
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. –