1

我试图通过 COM 公开我们的库,但似乎是在与工具作斗争而不是实际问题。无论我如何编写我的 COM 公开类,我都会收到警告:“XXX.dll 不包含任何可以为 COM 互操作注册的类型”(在项目属性中将项目标记为注册 COM 互操作)。即使是下面的简单类(作为程序集中唯一使用 ComVisible(false) 签名和标记的类)仍然存在警告:

  [Guid("77699130-7D58-4d29-BE18-385871B000D1")]
  [ComVisible(true)]
  public interface IExample
  {
    string GetText();
    void SetText(string text);
  }

  [Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
  [ComVisible(true)]
  public class Example : IExample
  {
    private string m_text = "default text";

    public string GetText()
    {
      return m_text;
    }

    public void SetText(string text)
    {
      m_text = text;
    }
  }

我试图从命令行运行 regasm,它很高兴地指出“类型注册成功”。但是,使用 /verbose 开关运行时不会显示额外的信息(我似乎记得它列出了名称或者可能只是列出了已注册类型的数量)。还尝试使用 /regfile 开关运行 regasm 以生成一个 regfile,该 regfile 会生成以下内容:

[HKEY_CLASSES_ROOT\ComExample.Example]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\ComExample.Example\CLSID]
@="{F91E5EE1-D220-43B5-90D1-A48E81C478B7}"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32]
@="mscoree.dll"
"ThreadingModel"="Both"
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\InprocServer32\1.0.0.0]
"Class"="ComExample.Example"
"Assembly"="COMInteropTesting, Version=1.0.0.0, Culture=neutral, PublicKeyToken=8568e57f6b170d6c"
"RuntimeVersion"="v2.0.50727"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\ProgId]
@="ComExample.Example"

[HKEY_CLASSES_ROOT\CLSID\{F91E5EE1-D220-43B5-90D1-A48E81C478B7}\Implemented Categories\{62C8FE65-4EBB-45E7-B440-6E39B2CDBF29}]

我不是任何衡量标准的 COM 向导,但注册对我来说似乎是有效的。但是,在程序集上运行 regasm 时,注册表中似乎没有出现任何内容。

所以我的问题是我是否在我的简单示例中遗漏了一些东西来进行注册工作,我是否看到错误的指示,注册是否真的正确,我怎样才能更好地确定 COM 注册是否真的有效

编辑:使用 Kev 建议的更改,我无法避免来自 VS2008 的警告,但实际上我可以直接使用 regasm 在注册表中注册某些内容(仅 VS2008 集成在注册表中没有任何内容)。

然后我尝试删除简单的类,所以我有一个空程序集。对此运行 regasm 没有报告任何类型的警告,只报告“类型注册成功”。在我的其他一些可能错误地暴露给 COM 的程序集上运行 RegAsm 时,我看到诸如“RegAsm:警告 RA0000:未注册类型”之类的警告。这里发生了什么,我可以相信除了注册表之外的任何东西,以及 regasm 的开/关警告呢?

4

1 回答 1

2

我根据您的代码创建了一个类库项目,如下所示:

在项目属性页面中,选择签名选项卡。选中“签署程序集”复选框并<New...>从“选择强名称密钥文件:”下拉框中进行选择。

然后我添加了以下类(Example.cs)

[Guid("77699130-7D58-4d29-BE18-385871B000D1")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[ComVisible(true)]
public interface IExample
{
    [DispId(1)]
    string GetText();

    [DispId(2)]
    void SetText(string text);
}

[Guid("F91E5EE1-D220-43b5-90D1-A48E81C478B7")]
[ClassInterface(ClassInterfaceType.None)]
[ComVisible(true)]
public class Example : IExample
{
    private string m_text = "default text";

    [ComVisible(true)]
    public string GetText()
    {
      return m_text;
    }

    [ComVisible(true)]
    public void SetText(string text)
    {
      m_text = text;
    }
}

然后我构建了这个项目,然后放到一个命令行中,从构建中输出 DLL。

注册:

regasm.exe COMInteropTesting.dll /register /codebase /tlb

如果您的组件需要可供多个应用程序访问:

gacutil.exe -i COMInteropTesting.dll

这在 Windows 2003 32 位、Windows 2008 32 位和 Windows 7 64 位上运行良好。

一个问题是,如果您在 64 位系统上使用 CScript 测试组件,则需要运行正确的 CScript 解释器。如果您使用 32 位RegAsm.exe(at C:\Windows\Microsoft.NET\Framework\v2.0.50727) 注册了程序集,那么您需要在c:\Windows\SysWOW64.

于 2009-10-30T10:24:18.760 回答