有没有办法在运行时设置Type的GUID?

时间:2011-02-09 00:59:30

标签: com guid ocx

如何动态设置类型的Guid?

愚蠢的问题,但我有一个在几个第三方COM对象上完全相同的界面,但每个界面都有不同的GUID。

我有一个C#界面,看起来像这样。

[Guid("1F13D3D8-3071-4125-8011-900D2EAC9A7F")]
[InterfaceType(2)]
[TypeLibType(4240)]
public interface UICtrl
{
  //stuff
}

我希望能够在运行时动态更改GUID,具体取决于用户选择加载的COM对象。我无法更改元数据,Type.Guid没有设置属性。有什么想法吗?

我无法使用Remit.Emit,因为调用程序集不使用它。我真的被卡住了!

2 个答案:

答案 0 :(得分:1)

所以我最后通过使用@ SLaks的答案和我自己的答案来解决这个问题。基本上我接受了我的父接口并从中生成了一个具有我想要的GUID的子接口。

AssemblyName aName = new AssemblyName("MulticasterAssembly");
            AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.Run);
            ModuleBuilder mb = ab.DefineDynamicModule("MulticasterModule");
            TypeBuilder tb = mb.DefineType("MainOCXMultiCaster", TypeAttributes.Public);
            tb.SetParent(typeof(AxUICtrlEventMulticaster));

            ConstructorInfo cInfo = typeof(GuidAttribute).GetConstructor(new Type[] {typeof(string)});
            CustomAttributeBuilder cab = new CustomAttributeBuilder(cInfo, new object[] { mOCXType.GUID.ToString() });
            tb.SetCustomAttribute(cab);

            ConstructorBuilder cb = tb.DefineDefaultConstructor(MethodAttributes.Public);

            Type childEventMulticaster = tb.CreateType();                

            object o = Activator.CreateInstance(childEventMulticaster);
            childEventMulticaster.InvokeMember("host", BindingFlags.SetProperty, null, o, new object[] { this });

答案 1 :(得分:0)

尝试制作三个空[Guid]'d接口,继承所有成员的基接口。