如何动态设置类型的Guid?
愚蠢的问题,但我有一个在几个第三方COM对象上完全相同的界面,但每个界面都有不同的GUID。
我有一个C#界面,看起来像这样。
[Guid("1F13D3D8-3071-4125-8011-900D2EAC9A7F")]
[InterfaceType(2)]
[TypeLibType(4240)]
public interface UICtrl
{
//stuff
}
我希望能够在运行时动态更改GUID,具体取决于用户选择加载的COM对象。我无法更改元数据,Type.Guid没有设置属性。有什么想法吗?
我无法使用Remit.Emit,因为调用程序集不使用它。我真的被卡住了!
答案 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接口,继承所有成员的基接口。