Com 有没有办法设置类型';运行时的GUID是多少?
如何动态设置类型的Guid 愚蠢的问题,但我有一个接口,它在几个第三方COM对象上完全相同,但每个对象都有不同的GUID 我有一个C#接口,看起来是这样的Com 有没有办法设置类型';运行时的GUID是多少?,com,guid,ocx,Com,Guid,Ocx,如何动态设置类型的Guid 愚蠢的问题,但我有一个接口,它在几个第三方COM对象上完全相同,但每个对象都有不同的GUID 我有一个C#接口,看起来是这样的 [Guid("1F13D3D8-3071-4125-8011-900D2EAC9A7F")] [InterfaceType(2)] [TypeLibType(4240)] public interface UICtrl { //stuff } 我希望能够在运行时根据用户选择加载的COM对象动态更改GUID。我无法更改元数据,并且Type
[Guid("1F13D3D8-3071-4125-8011-900D2EAC9A7F")]
[InterfaceType(2)]
[TypeLibType(4240)]
public interface UICtrl
{
//stuff
}
我希望能够在运行时根据用户选择加载的COM对象动态更改GUID。我无法更改元数据,并且Type.Guid没有set属性。有什么想法吗
我无法使用汇款.Emit,因为调用程序集未使用它。我真的卡住了 尝试创建三个空的
[Guid]
'd接口,这些接口继承了所有成员的基本接口。尝试创建三个空的[Guid]
'd接口,这些接口继承了所有成员的基本接口。因此,我最终通过使用@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 });
所以我最终用@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 });
如何使用该界面?@SLaks
(IConnectionPointContainer icpc=(IConnectionPointContainer)this.ocx;System.Guid g=typeof(UICtrl).Guid;icpc.FindConnectionPoint(ref g,out icp);icp.advice(eventMulticaster,out mCookie)
这就是为什么接口GUID需要与COM对象中的GUID相同的原因–抱歉…尽管底部有说明,但我一辈子都不知道如何使用mini markdown,google也无法帮助将其包装为`字符。我编辑了它。谢谢!我发誓我试过了!Noobs。你如何使用接口?@SLaks(IConnectionPointContainer icpc=(IConnectionPointContainer)this.ocx;System.Guid g=typeof(UICtrl.Guid);icpc.FindConnectionPoint(参考g,输出icp);icp.advice(eventMulticaster,输出mCookie)这就是为什么接口GUID需要与COM对象中的GUID相同的原因–抱歉…尽管底部有说明,但我一辈子都不知道如何使用mini markdown,google也无法帮助将其包装为`字符。我编辑了它。谢谢!我发誓我试过了!Noobs。我想我明白了。所以应该是[InterfaceType(2)][TypeLibType(4240)]公共接口UICtrl{//stuff}[Guid(“1F13D3D8-3071-4125-8011-900D2EAC9A7F”)]公共接口UICtrlSpec1:UICtrl{}[Guid(“另一个Guid”)]公共接口UICtrlSpec2:UICtrl{}[Guid(“另一个Guid”)]公共接口UICtrlSpec3:UICtrl{}
看到了吗?像你说的那样完全包装好了。没有骰子。那我该怎么换行呢?我知道这是一天的结束,但我真的那么密集吗?不幸的是,评论中不支持换行。回答你的问题,是的。不过,我不确定它是否有效。谢谢你的帮助。有问题的库提供了一种给我CLSID,我想继续使用它。根据你的建议,我必须硬编码它们(尽管,我可以加载更多)。仍然希望有一个解决方案!我想我明白了。所以应该是[InterfaceType(2)][TypeLibType(4240)]公共接口UICtrl{//stuff}[Guid(“1F13D3D8-3071-4125-8011-900D2EAC9A7F”)]公共接口UICtrlSpec1:UICtrl{}[Guid(“另一个Guid”)]公共接口UICtrlSpec2:UICtrl{}[Guid(“另一个Guid”)]公共接口UICtrlSpec3:UICtrl{}
看到了吗?像你说的那样完全包装好了。没有骰子。那我该怎么换行呢?我知道这是一天的结束,但我真的那么密集吗?不幸的是,评论中不支持换行。回答你的问题,是的。不过,我不确定它是否有效。谢谢你的帮助。有问题的库提供了一种给我CLSID,我想继续使用它。根据你的建议,我不得不硬编码它们(尽管,我可以加载更多)。仍然希望找到解决方案!