1

如何动态设置类型的 Guid?

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

我有一个看起来像这样的 C# 接口。

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

我希望能够根据用户选择加载的 COM 对象在运行时动态更改 GUID。我无法更改元数据,并且 Type.Guid 没有设置属性。有任何想法吗?

我不能使用 Remit.Emit 因为调用程序集不使用它。我真的被困住了!

4

2 回答 2

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 });
于 2011-02-09T18:55:26.637 回答
0

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

于 2011-02-09T01:15:45.543 回答