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