我需要创建一个基于c#的COM服务器在VBScript消费

本文关键字:COM 服务器 消费 VBScript 一个 创建 | 更新日期: 2023-09-27 17:51:24

我正在c#中创建一个COM服务器.dll ()。. NET 3.0 -外部需求)。一些客户可以很好地使用它,而另一些则不行。具体来说,我有问题让VBScript喜欢它。

  1. 有两个主要组成部分:

    。一个接口
    B.实现对象

    都有自己的GUID。实现类显式地实现接口

  2. 选中'Assembly Information'对话框'Make Assembly COM-Visible'。

  3. 'Build'对话框'Register for COM interop'也被选中。

  4. 我还签署了程序集,创建了一个强名称密钥。

无奈之下,我添加了System.EnterpriseServices.ServicedComponent组件:

[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
public class TwoPays : ServicedComponent, ITwoPays
{
    void ITwoPays.TestConnect()
    {
...
[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
public interface ITwoPays
{

我也跑了regsvcs.exe

RegSvcs.exe LandCORC.dllMicrosoft (R) .NET Framework Services Installation Utility Version 2.0.50727.5483版权(c)微软公司。版权所有

警告:程序集没有声明ApplicationAccessControl属性。默认情况下,应用程序安全将被启用。

安装装配:
组装:C: '释放源' LandCORC ' bin ' ' LandCORC.dll
应用范围:LandcORC
TypeLib: C: ' ' LandCORC ' bin '释放' LandCORC.tlb

因为我也不知道任何关于应用程序的安全,我不确定是否警告消息从RegSvcs.exe是重要的。

所以我一直在使用VbsEdit来测试它。在添加ServicedComponent并运行RegSvcs.exe之前,它会在执行Set objXL = CreateObject("LandCORC.TwoPays")语句时死亡。

现在完成了,但是当我尝试调用TestConnect时,它说objXL是一个无效指针,例如:

Dim objXL
Set objXL = CreateObject("LandCORC.TwoPays")
objXL.TestConnect

添加VbsEdit的引用:

Prog ID: LandCORC.TowPays
TypeLib path: C:'Source'LandCORC'bin'Release'LandCORC.tlb
GUID: {0135BC5C-B248-444C-94B9-B0B4577F5A1B}

但是如果我改变VbsEdit引用使用接口GUID代替,那么objXL的自动完成将显示正确的方法列表,但是当它执行时,我得到'对象不支持此属性或方法:TestConnect'而不是。

我不知道我需要什么来完成这个谜题。

新信息

根据Kev的回答,我已经更正了接口和类的定义。

[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1a" )]
[InterfaceType( ComInterfaceType.InterfaceIsDual )]
[ComVisible( true )]
public interface ITwoPays
{
    [DispId( 1 )]
    void TestConnect();
    [DispId( 2 )]
    void Terminate();

[Guid( "0135bc5c-b248-444c-94b9-b0b4577f5a1b" )]
[ClassInterface( ClassInterfaceType.None )]
[ComVisible( true )]
public class TwoPays : ITwoPays
{
    [ComVisible( true )]
    public void TestConnect()
    {
        LogInformationMessage( "TestConnect." );
    }
   [ComVisible( true )]
   public void Terminate()
   {

运行RegAsm/codebase/register/tlb返回干净,运行gacutil -i表示汇编成功添加到缓存

我需要创建一个基于c#的COM服务器在VBScript消费

这是来自一个项目,我有一个类似的需求,一个InProc COM包装。net组件可见的VBScript和经典ASP(在IDispatch友好的COM的说法)。

我已经重命名了接口、类和方法,但是你应该明白。

声明接口:

[Guid("0B201484-E388-45eb-9AB8-A6AE1E197AAB")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IThingy
{
    [DispId(1)]
    int DoThing1(string name, int age);
    [DispId(2)]
    string DoThing2(int id);
    [DispId(3)]
    bool DoThing3(string address);
}
实现:

[Guid("68FAB6AC-9923-425a-85F2-59B50552A5C1")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Thingy: IThingy
{
    [ComVisible(true)]
    public int DoThing1(string name, int age)
    {
        // ....
    }
    [ComVisible(true)]
    public string DoThing2(int id)
    {
        // ....
    }
    [ComVisible(true)]
    public bool DoThing3(string address)
    {
        // ....
    }
}

我还必须生成一个程序集密钥文件,这是因为COM包装的。net程序集需要"强命名"(我模糊地记得——我写这段代码已经十年了)。

接下来,我对注册表中所有有趣的COM连接的程序集进行了正则化:

regasm.exe COMExample.Fun.dll /register /codebase /tlb

然后把它扔进GAC:

gacutil.exe -i COMExample.Fun.dll

卸载:

gacutil.exe -u COMExample.Fun.dll,Version=1.0.0.0
regasm.exe COMExample.Fun.dll /unregister /tlb

去掉System.EnterpriseServicesServicedComponent的东西。只有当你要在COM+中运行一个进程外服务器并且需要COM+事务基础设施等时,你才需要它