Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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# 显示不一致行为的COM对象的Type.GetProperties()_C#_Reflection - Fatal编程技术网

C# 显示不一致行为的COM对象的Type.GetProperties()

C# 显示不一致行为的COM对象的Type.GetProperties(),c#,reflection,C#,Reflection,我正在尝试列出Microsoft Word“Shape”对象的所有运行时属性。我首先使用QueryInterface获取com对象的类型,然后调用GetProperties()。当我在控制台应用程序中使用它时,它工作得很好,我将COM对象类型设置为“Shape”,并返回该类型的70个属性。当我在winform按钮后面输入相同的代码时,我只得到1个属性。是否有任何具体原因或任何其他方式来实现这一点 Microsoft.Office.Interop.Word.Shape tbx = wordApp

我正在尝试列出Microsoft Word“Shape”对象的所有运行时属性。我首先使用QueryInterface获取com对象的类型,然后调用GetProperties()。当我在控制台应用程序中使用它时,它工作得很好,我将COM对象类型设置为“Shape”,并返回该类型的70个属性。当我在winform按钮后面输入相同的代码时,我只得到1个属性。是否有任何具体原因或任何其他方式来实现这一点

 Microsoft.Office.Interop.Word.Shape tbx = wordApp.ActiveDocument.Shapes.AddTextbox(Microsoft.Office.Core.MsoTextOrientation.msoTextOrientationHorizontal, 
        leftPosition + 5, topPosition + 5, 100, 50);

    Type objType = tbx.GetType();

    if (objType.IsCOMObject)
    {
        objType = GetTypeForComObject(tbx);
    }

    PropertyInfo[] properties2 = objType.GetProperties(BindingFlags.Public | BindingFlags.Instance);


private Type GetTypeForComObject(object wordComObject)
    {

        IntPtr iunkwn = System.Runtime.InteropServices.Marshal.GetIUnknownForObject(wordComObject);
        System.Reflection.Assembly wordAssembly = System.Reflection.Assembly.GetAssembly(typeof(Word.Application));
        Type[] wordTypes = wordAssembly.GetTypes();            
        foreach (Type currType in wordTypes)
        {
            Guid iid = currType.GUID;
            if (!currType.IsInterface || iid == Guid.Empty)
            {                    
                continue;
            }
            IntPtr ipointer = IntPtr.Zero;
            System.Runtime.InteropServices.Marshal.QueryInterface(iunkwn, ref iid, out ipointer);

            if (ipointer != IntPtr.Zero)
            {
                // yeah, that’s the one we’re after
                return currType;
            }
        }           
        return null;
    }

我还尝试使用GetFields()和Invoke(),但也不起作用。同样,将此作业放入backgroundworker线程也没有帮助。

它返回什么属性?欢迎使用堆栈溢出!请不要在问题标题中包含关于所用语言的信息,除非没有它就没有意义。标记用于此目的。什么是
GetTypeForComObject
?并且什么是obj?可能重复它只返回“Fill”属性@格伦迪,我见过这个帖子,但它没有解决这个问题。此外,DispatchUtility方法需要将近1分钟的时间来查询对象的类型。这就是我为什么使用QueryInterface的原因。Obj是我在代码段中提到的实际的“tbx”对象。