首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regasm和Com Interop假阴性

Regasm和Com Interop假阴性
EN

Stack Overflow用户
提问于 2009-10-30 18:16:20
回答 1查看 7.3K关注 0票数 1

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

代码语言:javascript
复制
  [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,该文件会生成以下内容:

代码语言:javascript
复制
[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的警告,但我实际上可以直接使用VS2008获得注册表中注册的内容(注册表中的任何内容都不是来自regasm集成)。

然后我尝试删除这个简单的类,这样我就有了一个空的程序集。对此运行regasm不会报告任何类型的警告,只会报告"Types registered“。当在我的一些其他程序集上运行RegAsm时,我看到了类似"RegAsm : warning RA0000 : No types may“的警告,这些程序集可能会错误地公开到COM。这里发生了什么,除了注册表之外,我可以信任任何东西吗?来自regasm的开/关警告怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-10-30 18:24:19

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

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

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

代码语言:javascript
复制
[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 (在C:\Windows\Microsoft.NET\Framework\v2.0.50727上)注册了程序集,则需要在c:\Windows\SysWOW64上运行32位CScript解释器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1648972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档