Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com 有没有办法设置类型';运行时的GUID是多少?_Com_Guid_Ocx - Fatal编程技术网

Com 有没有办法设置类型';运行时的GUID是多少?

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

愚蠢的问题,但我有一个接口,它在几个第三方COM对象上完全相同,但每个对象都有不同的GUID

我有一个C#接口,看起来是这样的

[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,我想继续使用它。根据你的建议,我不得不硬编码它们(尽管,我可以加载更多)。仍然希望找到解决方案!