【发布时间】:2011-11-09 10:37:31
【问题描述】:
我确信我的问题的答案是这个论坛上已经存在的许多主题的组合。也许你可以帮我把这些拼凑起来。
所以我的挑战是,我有一些 C++ 代码实现了如下所示的接口:
interface ItsSupplier : IDispatch {
[propget, id(1), helpstring("property name") HRESULT Name([out, retval] BSTR* pVal);
}
实现此接口的 DLL 是第三方软件中可用的插件。 我想制作一个用.NET 编写的插件。 由于使用插件的软件不是 .NET,我假设 DLL 必须是 COM 对象。
这是我在 .NET 中的处理方式。
[Guid("xxxx")]
public interface ItsSupplier {
[DispId(1)]
[return: MarshalAs(UnmanagedType.Bstr)]
string Name { get; }
}
[Guid("xxxx"),
ClassInterface(ClassInterfaceType.AutoDispatch),
ComSourceInterfaces(typeof(ItsSupplier))]
public class SupplierClass : ItsSupplier
{
public string { get { return "someName"; } }
}
}
在项目设置下,我检查了“注册 COM 互操作”。
构建后我运行“regasm testDll.dll”
我的问题是……
自己定义 ItsSupplier 接口是否正确?我的意思是,这是第三方软件所期望的接口,所以必须在其他地方引用它吗?
关于 COM 互操作部分,我做得对吗?
我希望我的解释是正确的:)
干杯 /托马斯
---------------- 汉斯回复后编辑 ------------------------
当我构建 tlb 文件并在 Oleview 中查看原始文件和我的版本时,这就是我得到的。
这是 Oleview 中原始界面插件的样子:
[
odl,
uuid(370B4079-40BB-47C9-B797-33B3B5422685),
helpstring("ItsSupplier Interface"),
dual,
oleautomation
]
interface ItsSupplier : IDispatch {
这是我的样子:
[
odl,
uuid(370B4079-40BB-47C9-B797-33B3B5422685),
version(1.0),
dual,
oleautomation,
custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, "COMDLL.ItsSupplier")
]
interface COMDLL_ItsSupplier : IDispatch {
“COMDLL”是我的 Visual Studio 项目的名称。你认为这重要吗?
/托马斯
【问题讨论】: