我最近一直在寻找一种在VBScript中使用未注册的DLL的方法。 This接受的答案说可以使用GetObject
完成,前提是(在给出答案的人的评论中提到)DLL暴露了COM接口。我以前从未在C#中编码,但我想尝试一下,因为答案是针对那种语言的。经过一些搜索,我在this网站上找到了以下代码示例:
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);
}
}
}
使用Visual Studio 2010 Professional,我创建了一个新的C#类库并将其命名为Tester。我将上面的代码复制到默认的Class1.cs文件中并进行编译。然后,我使用以下代码创建了一个.vbs文件:
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
但是,代码引发了错误,并且不会实例化该对象。我尝试在32位和64位版本的wscript.exe上运行.vbs文件,因为我在Windows 7 64位上。但是,两次错误都是一样的。那么,我需要在C#代码和/或我需要在Visual Studio中更改的其他选项中更改某些内容,或者链接答案中的人声称是否错误?
编辑1
我的问题不是this的问题。我意识到有类似性质的请求。但是,我的问题与举证责任有关。 Nilpo声明GetObject
将允许VBScript使用未注册的C#DLL实例化一个对象,只要它暴露一个COM接口,甚至在同一个问题中为自己的位置辩护。我尽我所能利用他描述的方法并且没有成功。所以,如果有可能,我希望看到一个简单的工作示例。而且,如果没有,我希望看到一些文件显示为什么不。
此外,如果这真的是允许我正在寻求的功能的唯一方法,我将很乐意使用另一种编程语言。因此,我从我的问题标题中删除了C#并取出了C#标签。
编辑2
我修复了我发布的原始C#代码的语法高亮显示。我在第一次编辑中从问题中删除了C#标签后,它就崩溃了。
答案 0 :(得分:0)
您处于正确的轨道,但CodeProject链接要求您使用COM注册库,这需要提升权限。
但是,如果您将ComVisible
attribute添加到要公开的类中,则在编译DLL后,您应该可以通过GetObject()
调用它。
[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);
}
}