Есть ли способ установить GUID Типа во время выполнения? - PullRequest
1 голос
/ 09 февраля 2011

Как я могу установить 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 ]

1 голос
/ 09 февраля 2011

Так что я решил исправить это, используя часть ответа @ 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 });
0 голосов
/ 09 февраля 2011

Попробуйте создать три пустых интерфейса [Guid] d, которые наследуют базовый интерфейс со всеми членами.

...