编程语言
首页 > 编程语言> > 我需要创建一个基于C#的COM Server以便在VBScript中使用

我需要创建一个基于C#的COM Server以便在VBScript中使用

作者:互联网

我正在C#中创建COM服务器.dll(.NET 3.0-外部要求).一些客户可以很好地使用它,而其他客户则不能.具体来说,我在让VBScript喜欢它时遇到了问题.

>有两个主要组成部分:

一种.接口
b.一个实现对象

他们都有自己的GUID.实现类EXPLICITLY实现该接口.
>选中“装配体信息”对话框复选框“使装配体COM-可见”.
>还将选中“构建”对话框复选框“注册COM互操作”.
>我也签署了大会,创建了一个强名称密钥.

无奈之下,我添加了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.dll
Microsoft (R) .NET Framework Services Installation Utility Version 2.0.50727.5483
Copyright (c) Microsoft Corporation. All rights reserved.

失败的原因:

WARNING: The assembly does not declare an ApplicationAccessControl Attribute. Application security will be enabled by default.

Installed Assembly:
Assembly: C:\Source\LandCORC\bin\Release\LandCORC.dll
Application: LandcORC
TypeLib: C:\Source\LandCORC\bin\Release\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一样,这表明Assembly已成功添加到缓存中

解决方法:

这来自我有类似要求的项目,一个InProc COM包装的.NET组件对VBScript和Classic ASP可见(如COM说法中的IDispatch friendly).

我已将接口,类和方法重命名,但是您应该明白了.

声明我们的界面:

[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.EnterpriseServices和ServicedComponent之类的东西.仅在要在COM中运行进程外服务器并且需要COM事务基础结构等时才需要.

标签:vbscript,com,c,net
来源: https://codeday.me/bug/20191120/2042324.html