Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.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
C# 以后期绑定方式访问CommandBarButton.Picture属性_C#_Dynamic_Office Interop_Commandbar - Fatal编程技术网

C# 以后期绑定方式访问CommandBarButton.Picture属性

C# 以后期绑定方式访问CommandBarButton.Picture属性,c#,dynamic,office-interop,commandbar,C#,Dynamic,Office Interop,Commandbar,我试图阅读*.mdb中包含的Microsoft Access(Office)commandbar信息。我可以使用Microsoft.Office.Interop.Access进行此操作;但是,这些PIA程序集与特定的Office版本相关联。因此,为了独立于版本,我通过C#的dynamictype以后期绑定的方式来实现。也就是说,我没有对Microsoft Office特定程序集的引用。这样做的代价是,现在对命令栏的访问是弱类型的 这种方法效果很好,除非我尝试访问自定义按钮图像。这是我真实代码的浓

我试图阅读*.mdb中包含的Microsoft Access(Office)
commandbar
信息。我可以使用
Microsoft.Office.Interop.Access
进行此操作;但是,这些PIA程序集与特定的Office版本相关联。因此,为了独立于版本,我通过C#的
dynamic
type以后期绑定的方式来实现。也就是说,我没有对Microsoft Office特定程序集的引用。这样做的代价是,现在对命令栏的访问是弱类型的

这种方法效果很好,除非我尝试访问自定义按钮图像。这是我真实代码的浓缩版本,用于说明问题:

dynamic access =  Activator.CreateInstance(Type.GetTypeFromProgID("Access.Application", true));
// Starts an Access XP (2002) process in my case, but could be any version.

foreach (dynamic commandBar in access.CommandBars) {
    if (!commandBar.BuiltIn) { // Only my menus and toolbars.
        foreach (dynamic control in commandBar.Controls) {
            if (control.Type == (int)MsoControlType.msoControlButton && !control.BuiltInFace) {
                string caption = control.Caption; // Works.
                stdole.IPictureDisp picture = control.Picture; // <==== Throws exception! ====
                // ...
            }
        }
    }
}
dynamic access=Activator.CreateInstance(Type.GetTypeFromProgID(“access.Application”,true));
//在我的例子中,启动Access XP(2002)进程,但可以是任何版本。
foreach(access.commandBar中的动态commandBar){
如果(!commandBar.BuiltIn){//仅我的菜单和工具栏。
foreach(commandBar.Controls中的动态控件){
if(control.Type==(int)MsoControlType.msoControlButton&&!control.BuiltInFace){
字符串caption=control.caption;//有效。

stdole.IPictureDisp picture=control.picture;/“Dumb question”:命令栏控件实际上有图片吗?因为代码循环了所有控件,我只需要问一下……这里实际涉及的是哪个版本的Access?非常快速地看一下CommandBars.control对象(2010)不会显示
Picture
属性,甚至不会显示为隐藏成员。但是
CommandBarButton
确实有这样一个属性。我认为您需要确定类型,然后强制转换为正确类型的对象。测试
control.type==(int)MsoControlType.msoControlButton
确保我们有一个带有这样一个属性的
CommandBarButton
。我无法直接测试类型,因为它在调试器中显示为
System.\uu ComObject
。(当然,真正的类型不可用,因为我没有引用任何Office库或PIA程序集。)如果属性不存在,则会引发异常
“System.\u ComObject”不包含“NonExistentProperty”的定义。
。我不是说它会找到该类型的控件。我是说,您需要创建该类型的特定对象,并使用强制转换将该控件分配给它,以便您拥有一个实际具有Pi的对象cture property.VBA可能会实现概念上的飞跃(虽然在本例中我不指望它——我似乎记得它不起作用,但已经有10多年了),以我的经验,C#没有那么灵活。大致如下:
Office.CommandBarButton cbb=(Office.CommandBarButton)控件;
注意:VBA可以在快速测试后执行此操作。如果您确实想返回更通用的
控件,可以尝试PInvoke。