题
我试图揭露通过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解释器。