好的,我疯了。我一直在努力使一个简单的.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。

最后一个注意事项 - 我的大部分测试都围绕着一个未签名的程序集,但我试图查明我使用强名称/密钥尝试的错误,但它没有做任何事情。

有人可以帮我找到问题吗?

有帮助吗?

解决方案 2

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

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

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

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

的另一个位置
regasm MyNamespace.MyClass.dll /codebase /regfile

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

这使它工作 - 每当我进行更改时,我只需重新编译并复制旧文件(不注销),然后我只会这样做:

regasm MyNamespace.MyClass.dll /codebase

......就是这样 - 我对myClass所做的更改在我的vbscript和我的asp页面中都可以立即显示。

其他提示

我提到过我运行Windows 7 RC 64位吗?

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

您是否需要定义一些具有这些方法的接口,并实现该接口?

这对我有用:

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

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

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

检查此链接是否完美有效我遵循它并为错误提供了完美的解决方案,例如"对象不支持此属性或方法“ 代码项目帮助

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top