【发布时间】:2010-09-16 18:28:23
【问题描述】:
由于我无法控制的公司限制,我有以下情况:
定义以下接口的 COM 库(没有 CoClass,只有接口):
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IService Interface"),
pointer_default(unique)
]
IService : IDispatch
{
HRESULT DoSomething();
}
[
object,
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
dual,
nonextensible,
helpstring("IProvider Interface"),
pointer_default(unique)
]
IServiceProvider : IDispatch
{
HRESULT Init( IDispatch *sink, VARIANT_BOOL * result );
HRESULT GetService( LONG serviceIndicator, IService ** result );
};
[
uuid(xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),
version(1.0),
]
library ServiceLibrary
{
importlib("stdole2.tlb");
interface IService;
interface IServiceProvider;
};
我有一个 COM(用 C++ 编写),它实现了这两个接口并为我们的应用程序提供了上述服务。我认为一切都很好。
我正在尝试在 .NET (C#) 中构建新的 IProvider 和 IService。
我为 COM 库构建了一个主互操作程序集,并实现了以下 C#:
[ComVisible( true )]
[Guid( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" )]
public interface INewService : IService
{
// adds a couple new properties
}
[ComVisible( true )]
[Guid( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" )]
public class NewService : INewService
{
// implement interface
}
[ComVisible( true )]
[Guid( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" )]
public interface INewProvider : IServiceProvider
{
// adds nothing, just implements
}
[ComVisible( true )]
[Guid( "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" )]
public class NewProvider : INewProvider
{
// implement interface
}
当我尝试将其放入现有运行时时,我能够从 COM (C++) 创建 NewProvider 对象,并为 IServiceProvider 创建 QueryInterface。当我尝试调用 IServiceProvider 上的方法时,会抛出 System.ExecutionEngineException。
我唯一能找到的另一件事是,通过查看由#import 创建的 .tlh 文件,它显示了旧 COM IExistingProvider 类正确地表明它是从 IServiceProvider 派生的。但是 .NET 类显示了 IDispatch 的基础。我不确定这是否是一个标志、指示、有用的东西。
【问题讨论】:
-
当你说你已经“构建”了一个主互操作程序集时,你的意思是从头开始吗?难道不能只是添加 COM 库作为参考吗?
-
我从 TLBIMP.exe 构建了 PIA。您想查看它的示例命令行吗?我使用了 TLBIMP,创建了我自己的 Interop.Services.dll,然后引用它。我最近获得了“.NET 和 COM - 完整的互操作性指南”。
-
您没有将库直接导入 Visual Studio 有什么原因吗?或者您没有使用 Visual Studio?