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

显示名称

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

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

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

    他们都有自己的GUID。实现类明确实现了接口。

  2. 选中“装配体信息”对话框复选框“使装配体COM-可见”。

  3. 还选中了“生成”对话框复选框“注册COM互操作”。

  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.dll Microsoft(R).NET Framework Services安装实用程序版本2.0.50727.5483版权所有(c)Microsoft Corporation。版权所有。

失败的原因:

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

已安装的程序集:程序集:
C:\ Source \ LandCORC \ bin \ Release \ LandCORC.dll
应用程序: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是可见的(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.EnterpriseServices和的ServicedComponent东西。仅在要在COM +中运行进程外服务器并且需要COM +事务基础结构等时才需要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

将 3 个单独的列合并为一列,以便在 IN 子句中使用

来自分类Dev

如何在我的管理网站上获取配置API以便在“登录页面”中使用?

来自分类Dev

我可以从一个类中获取rect.x以便在另一个类中使用吗?

来自分类Dev

使对象保持活动状态,以便在python的另一个程序中使用它们

来自分类Dev

是否有一些推荐的方法来为ParseObject创建一个ID,以便在RecyclerView中使用?

来自分类Dev

如何将包装DLL连接到API DLL以便在C#项目中使用?

来自分类Dev

如何将VBA long&HFFFFFFF0转换为uint以便在C#中使用?

来自分类Dev

如何在C#中获得不可为空的T以便在函数中使用它?

来自分类Dev

我可以使用Django的模板语言来构造HTML以便在JSON响应字段中使用吗?

来自分类Dev

我需要在我的C#应用程序中使用Winrar压缩一个或多个文件

来自分类Dev

c# - 如何按顺时针顺序(tl、tr、br、bl)对 4 个点的列表进行排序,以便在 opencv getPerspective 中使用?

来自分类Dev

尝试创建一个新的CoreData Entity var,以便稍后在我的应用中使用

来自分类Dev

复制一个结构以便在另一个线程上使用

来自分类Dev

我在SQL Server中有2个表,我想让它们成为最高枢纽,以便在更新一个表时立即创建一个新列

来自分类Dev

使用JavaScript,以便在单击图像时更改另一个元素的位置

来自分类Dev

如何建立一个可变的Vecs池,以便在Drop上重复使用?

来自分类Dev

如何编写代码,以便在使用 django 的模型中只选择一个单选按钮。?

来自分类Dev

我应该在哪里启动DirectX以便在C#中简单使用?

来自分类Dev

[Ember.js]将模板助手创建的模板助手作为属性传递给组件,以便在组件模板中使用它?

来自分类Dev

如何将图像文件夹添加到CMake项目,以便在c ++可执行文件中使用这些图像?

来自分类Dev

C#我将如何向我的应用程序添加基本验证,以便在输入错误的用户名或密码时显示一个消息框

来自分类Dev

我正在尝试使用if语句基于不同的数据框创建一个新的数据框

来自分类Dev

我可以使用哪种Ninject绑定,以便在构造函数中将一个参数用于另一个参数?

来自分类Dev

我只需要使用另一个列表中的重复项创建一个列表

来自分类Dev

我想创建一个路由,以便在登录后自动将用户重定向到主页

来自分类Dev

我是否需要整理由CreateStreamOnHGlobal返回的IStream,以便在线程之间使用?

来自分类Dev

使用jQuery,我需要根据输入值创建一个定界字符串

来自分类Dev

jQuery HELP-我需要创建一个可以多次使用的变量

Related 相关文章

  1. 1

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

  2. 2

    将 3 个单独的列合并为一列,以便在 IN 子句中使用

  3. 3

    如何在我的管理网站上获取配置API以便在“登录页面”中使用?

  4. 4

    我可以从一个类中获取rect.x以便在另一个类中使用吗?

  5. 5

    使对象保持活动状态,以便在python的另一个程序中使用它们

  6. 6

    是否有一些推荐的方法来为ParseObject创建一个ID,以便在RecyclerView中使用?

  7. 7

    如何将包装DLL连接到API DLL以便在C#项目中使用?

  8. 8

    如何将VBA long&HFFFFFFF0转换为uint以便在C#中使用?

  9. 9

    如何在C#中获得不可为空的T以便在函数中使用它?

  10. 10

    我可以使用Django的模板语言来构造HTML以便在JSON响应字段中使用吗?

  11. 11

    我需要在我的C#应用程序中使用Winrar压缩一个或多个文件

  12. 12

    c# - 如何按顺时针顺序(tl、tr、br、bl)对 4 个点的列表进行排序,以便在 opencv getPerspective 中使用?

  13. 13

    尝试创建一个新的CoreData Entity var,以便稍后在我的应用中使用

  14. 14

    复制一个结构以便在另一个线程上使用

  15. 15

    我在SQL Server中有2个表,我想让它们成为最高枢纽,以便在更新一个表时立即创建一个新列

  16. 16

    使用JavaScript,以便在单击图像时更改另一个元素的位置

  17. 17

    如何建立一个可变的Vecs池,以便在Drop上重复使用?

  18. 18

    如何编写代码,以便在使用 django 的模型中只选择一个单选按钮。?

  19. 19

    我应该在哪里启动DirectX以便在C#中简单使用?

  20. 20

    [Ember.js]将模板助手创建的模板助手作为属性传递给组件,以便在组件模板中使用它?

  21. 21

    如何将图像文件夹添加到CMake项目,以便在c ++可执行文件中使用这些图像?

  22. 22

    C#我将如何向我的应用程序添加基本验证,以便在输入错误的用户名或密码时显示一个消息框

  23. 23

    我正在尝试使用if语句基于不同的数据框创建一个新的数据框

  24. 24

    我可以使用哪种Ninject绑定,以便在构造函数中将一个参数用于另一个参数?

  25. 25

    我只需要使用另一个列表中的重复项创建一个列表

  26. 26

    我想创建一个路由,以便在登录后自动将用户重定向到主页

  27. 27

    我是否需要整理由CreateStreamOnHGlobal返回的IStream,以便在线程之间使用?

  28. 28

    使用jQuery,我需要根据输入值创建一个定界字符串

  29. 29

    jQuery HELP-我需要创建一个可以多次使用的变量

热门标签

归档