3

好吧,我要疯了。我一直在尝试使一个简单的.net 程序集可见以用作 COM 对象,但它不起作用。我一直在尝试很多不同的方法,但都没有奏效。到目前为止,我得到的最接近的是属性、接口、手动注册等最少的那个。

我有一个 vbscript 作为测试,如下所示:

Dim o
o = CreateObject("MyNamespace.MyClass")
msgbox o.Test()

我的 c# 代码如下所示:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace 
{
  [ProgId("MyNamespace.MyClass")]
  public class MyClass
  {
    public string Test()
    {
       return "teststring";
    }
  }
}

在我的项目(VS2008)上,我选择了“使程序集 COM 可见”——它向我的 AssemblyInfo.cs 添加了一个属性,我还检查了“注册 COM 互操作”。

我可以看到 ProgId 真的没有什么区别(无论如何在我的情况下) - 只要我指定真正的名称空间+类名,我可以覆盖它,我认为这很好。

问题是 - 我的 CreateObject 运行良好,但找不到方法 Test()。事实上,如果我使用 dll 并提取 tlb 并期望我根本看不到任何方法。

我得到的错误是这样的:

C:\inetpub\wwwroot\ASPTest\testrun.vbs(3, 1) Microsoft VBScript 运行时错误:对象不支持此属性或方法:“测试”

我很想得到任何反馈,但只是为了让你知道我一直在尝试什么。我在类上搞乱了 Guid 和 AttributeGuid,在类上明确定义了 COMVisible,我尝试不注册 COM 互操作,而是做了 regasm /codebase /regfile。

最后一点-我的大多数测试都围绕未签名的程序集展开,但试图查明我尝试使用强名称/密钥的错误,但它没有做任何事情。

谁能帮我找出问题,好吗?

4

5 回答 5

2

我有没有提到我运行 Windows 7 RC 64 位?

好吧,我认为这可能解释我的 VS 做得不对: http: //kbalertz.com/956933/Issues-building-project-assembly.aspx 似乎 VS 使用 32 位版本的注册表而不是 64 位...

于 2009-06-16T12:36:36.917 回答
1

我从一开始就在我的项目中删除了有关 COM 互操作的任何内容,然后我添加了

[Guid(...some guid...)]
[ComVisible(true)]

在 MyClass 上,我添加了一个强名称(使用项目设置来设置它 - 而不是在 AssemblyInfo.cs 中定义它。

当我编译程序集时,我将文件复制到另一个我做了

regasm MyNamespace.MyClass.dll /codebase /regfile

然后我运行并接受了注册表项。

这使它起作用 - 每当我进行更改时,我只需重新编译并将文件复制到旧文件(没有取消注册),然后我只做:

regasm MyNamespace.MyClass.dll /codebase

...就是这样 - 我对 MyClass 所做的更改在我的 vbscript 和我的 asp 页面中立即可见。

于 2009-06-17T06:41:02.360 回答
0

您不需要定义一些具有方法的接口并实现该接口吗?

于 2009-06-16T12:25:52.383 回答
0

这对我有用:

using System;
using System.Runtime.InteropServices;
namespace MyNamespace
{

    [GuidAttribute("8DDE02DF-B31C-4d91-98A7-C64444701985")]
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class clsCOMWraper
    {
       public string Test()
      {
         return "teststring";
      }
    }
}

这些程序集必须签名。

注册 regasm /codebase

于 2009-06-16T12:39:17.193 回答
0

我没有看到该类的任何构造函数。COM Interop 需要一个默认构造函数(没有任何参数)才能成功生成 COM 接口。

尝试添加一个构造函数,看看它是否有效。

于 2009-06-29T20:04:44.743 回答