2011-05-31 200 views
4

是否可以通过Microsoft.Office.Interop.Excel.ApplicationClass确定Excel是以32位还是64位运行?

编辑
的解决方案应为Excel 2010和Excel 2007从Excel应用程序对象中查找位(32位/ 64位)?

+0

您的意思是您的程序与Excel不在同一个进程中? – 2011-05-31 12:56:34

+1

@Simon - 我不太明白你的问题。 Excel自动进程外,所以没有程序可以在同一个进程中与Excel交谈。如果我有一个ApplicationClass对象(通过Excel互操作),我想知道是否可以确定关联的Excel进程是运行32位还是64位(必须是Excel 2010) – SFun28 2011-05-31 13:00:30

+0

即对象模型是否支持信息关于Excel进程的位数 – SFun28 2011-05-31 13:01:46

回答

6

此代码应该给你的Excel“位数”既工作。

Microsoft.Office.Interop.Excel.ApplicationClass app = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
if (System.Runtime.InteropServices.Marshal.SizeOf(app.HinstancePtr) == 8) 
{ 
    // excel 64-bit 
} 
else 
{ 
    // excel 32-bit 
} 

编辑:这里是另一个应该针对以前版本的Excel工作以及版本。只需传递一个ApplicationClass参考:

public static ExcelVersion GetExcelVersion(object applicationClass) 
    { 
     if (applicationClass == null) 
      throw new ArgumentNullException("applicationClass"); 

     PropertyInfo property = applicationClass.GetType().GetProperty("HinstancePtr", BindingFlags.Instance | BindingFlags.Public); 
     if (property == null) 
      return ExcelVersion.Excel; 

     return (System.Runtime.InteropServices.Marshal.SizeOf(property.GetValue(applicationClass, null)) == 8) ? ExcelVersion.Excel2010_64 : ExcelVersion.Excel2010_32; 
    } 

    public enum ExcelVersion 
    { 
     Excel, // before 2010, so 32 bits 
     Excel2010_32, 
     Excel2010_64 
    } 
+0

我也想提出这个问题,但我没有这样做,因为它只适用于Excel 2010. – 2011-05-31 13:18:02

+0

@丹尼尔 - 有没有一种解决方案可以与Excel 2007一起使用。实际上,我的问题的目的是确定我是在运行64位2010还是32位2007.我有一个混合环境。 – SFun28 2011-05-31 13:22:02

+0

我想我可以尝试获取HinstancePtr,如果失败,那么我知道我正在运行32位,因为平台是<2010只有32位?会抛出什么异常?我的程序集是针对14.0进行编译的,但是当我知道2007是在框中时,我在app.config中将程序集重定向到12.0。 – SFun28 2011-05-31 13:26:58