我试图通过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,该文件会生成以下内容:
[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的开/关警告怎么办?
发布于 2009-10-30 18:24:19
我根据您的代码创建了一个类库项目,如下所示:
在项目属性页中,选择Signing选项卡。选中“对程序集签名”复选框,并从“选择强名称密钥文件:”下拉框中选择<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 (在C:\Windows\Microsoft.NET\Framework\v2.0.50727上)注册了程序集,则需要在c:\Windows\SysWOW64上运行32位CScript解释器。
https://stackoverflow.com/questions/1648972
复制相似问题