我试图揭露通过COM我们的图书馆,但似乎战斗的工具多于实际问题。不管我怎么写我的COM暴露类我得到警告:“XXX.dll不包含可以注册为COM互操作的任何类型的”(项目属性标记项目作为注册为COM互操作)。甚至低于简单类(如在一个组件中的唯一的类是有符号和标记有ComVisible特性(假)标记)还是警告仍然存在:

  [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。然而,随着/详细开关没有额外的信息显示运行(我似乎记得它列出的名称或者只是注册类型的数量)。还试图运行与/ REGFILE开关regasm以产生生成此一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注册的实际工作

编辑: 使用千电子伏建议改变我不能避免VS2008的警告,但在使用直接注册表regasm(在注册表中没有正好从VS2008集成),我可以真正得到的东西登记。

我然后试图让我不得不一个空组件以除去简单类。在这个运行regasm没有报告任何形式的警告,只有“成功注册类型”。我看到这样的警告“RegAsm:警告RA0000:无类型注册了”关于我的一些其他组件可能会错误地暴露在COM运行RegAsm时。这是怎么回事就在这里,可我相信,除了注册表中任何东西,怎么样从regasm开/关警告?

有帮助吗?

解决方案

我创建了一个基于代码中的类库项目如下:

在项目属性页面中,选择签名标签。选中“登录大会”复选框,并选择<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位。

有一个问题是,虽然如果你想要测试与组件说CScript将在64位系统上,你需要运行正确的CScript解释。如果使用32位RegAsm.exe(在C:\Windows\Microsoft.NET\Framework\v2.0.50727)注册的组件则需要运行在c:\Windows\SysWOW64 32位的CScript解释器。

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