我目前正在将一些代码从本机C ++迁移到托管C ++(纯)。该代码涉及与Windows Active Scripting交互。目前我们的本机代码提供了 名为'ObjectDispatch'的类,它实现'IDispatch'(使用ATL)。这个类实现在运行时查询我们自己的本机类'Object',以确定它支持哪些方法和属性,然后将任何'IDispatch :: Invoke'调用转发给这个'Object'。
我见过使用支持'IDispatch'的.NET COM互操作的示例,但是那些从IDL派生或基于规范的实现 .NET类,在运行时都不会发生。
似乎.NET COM互操作可以生成'IDispatch'的实现 在编译时,如果您在给定的类上使用以下属性:
[ClassInterface(ClassInterfaceType::AutoDispatch)]
我假设我可以在运行时动态生成一个支持该属性的类。然而,在我尝试之前,我想知道是否有人有任何想法 如何通过与本机代码一起使用的类似方法实现这一目标。
请注意,此时“Object”类仍保留为本机类。
答案 0 :(得分:1)
得到微软的一些官方反馈意见“可能”有效。没有时间确认,但如果有人感兴趣,我认为发布是个好主意。
[Guid("00020400-0000-0000-c000-000000000046"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IDispatch
{
int GetTypeInfoCount();
ITypeInfo GetTypeInfo(
[MarshalAs(UnmanagedType.U4)] int iTInfo,
[MarshalAs(UnmanagedType.U4)] int lcid);
[PreserveSig]
int GetIDsOfNames(
ref Guid riid,
[MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr)] string[] rgsNames,
int cNames,
int lcid,
[MarshalAs(UnmanagedType.LPArray)] int[] rgDispId);
[PreserveSig]
int Invoke(
int dispIdMember,
ref Guid riid,
[MarshalAs(UnmanagedType.U4)] int lcid,
[MarshalAs(UnmanagedType.U4)] int dwFlags,
ref System.Runtime.InteropServices.ComTypes.DISPPARAMS pDispParams,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] pVarResult,
ref System.Runtime.InteropServices.ComTypes.EXCEPINFO pExcepInfo,
[Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] pArgErr);
}
class IImplimentIDispatch : IDispatch
{
public IImplimentIDispatch(object o)
{
_o = o;
…