1

タイプのGUIDを動的に設定するにはどうすればよいですか?

ばかげた質問ですが、いくつかのサードパーティのCOMオブジェクト間でまったく同じインターフェイスがありますが、それぞれに異なるGUIDがあります。

私はそのように見えるC#インターフェースを持っています。

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

ユーザーがロードすることを選択したCOMオブジェクトに応じて、実行時にGUIDを動的に変更できるようにしたい。メタデータを変更できません。Type.Guidにはsetプロパティがありません。何か案は?

呼び出し元のアセンブリがRemit.Emitを使用していないため、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]すべてのメンバーを持つ基本インターフェースを継承する3 つの空の 'd インターフェースを作成してみてください。

于 2011-02-09T01:15:45.543 に答える