2011-02-09 1 views
1

Как я могу установить динамический тип динамически?Есть ли способ установить 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

Как вы используете интерфейс? – SLaks

+0

@SLaks '(IConnectionPointContainer icpc = (IConnectionPointContainer) this.ocx; System.Guid g = typeof (UICtrl) .GUID; icpc.FindConnectionPoint (ref g, out icp); icp.Advise (eventMulticaster, out mCookie); почему GUID интерфейса должен быть таким же, как тот, что в COM-объекте - –

+0

Извините ... Я не могу на всю жизнь понять, как использовать мини-уценку, несмотря на инструкции внизу, а google не помогает –

ответ

0

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

+0

Я думаю, что я понимаю. Так что это будет '[InterfaceType (2)] [TypeLibType (4240)] открытый интерфейс UICtrl { // материал } [Guid ("1F13D3D8-3071-4125-8011-900D2EAC9A7F")] открытый интерфейс UICtrlSpec1: UICtrl {} [Guid ("Другой GUID")] открытый интерфейс UICtrlSpec2: UICtrl {} [Guid ("Еще одна GUID ")] Открытый интерфейс UICtrlSpec3: UICtrl {}' –

+0

См.? Полностью завернутый, как вы сказали. Нет кубиков. И как, черт возьми, я делаю разрывы строк? Я знаю, что это конец дня, но действительно ли я такой плотный? –

+0

К сожалению, символы новой строки не поддерживаются в комментариях. – SLaks

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 });