加载所有COMtypes的Exceldynamic?

我想探索这个dynamic使用Excel的path。


我想在我的C#应用​​程序中使用Excel,而不包括dll和东西。 如果所需的Excel版本已安装并运行,我将首先检查。

首先,我想获得所有我需要的types,但是我无法得到它们:

// works Type typeExcel = Type.GetTypeFromProgID("Excel.Application"); object excel = Activator.CreateInstance(typeExcel); object workbooks = typeExcel.InvokeMember("Workbooks", BindingFlags.GetProperty, null, excel, null); // this doesn't work, returns null Type typeWorkbooks = Type.GetTypeFromProgID("Excel.Workbooks"); 

没有正确的types,我不能调用成员。 那么我做错了什么? 如何加载我需要的所有types,并知道它们在那里? 我目前的Excel版本是2003年。


原因如下:如果我包含目标系统上没有安装的COM库,我的应用程序不会启动。 如果我dynamic加载它们,我可以检查它们的存在并通知用户有关缺less的function。

使用dynamic

 Type typeExcel = Type.GetTypeFromProgID("Excel.Application"); dynamic excel = Activator.CreateInstance(typeExcel); excel.Visible = true; dynamic workbooks = excel.Workbooks; workbooks.Add(); workbooks.Add(); 

也看到这个答案 。

如果我包含目标系统上未安装的COM库,我的应用程序将无法启动。

你正在寻找的治疗比问题要糟得多。 您在代码片段中尝试使用的后期绑定Office代码没有任何优点。 在C#版本4中支持的dynamic关键字肯定使语法更友好。 然而,在编写代码的时候没有什么友好的,你不会得到任何的IntelliSense。 没有什么友好的运行时间,你在编码时所犯的错误将会导致exception,而后期绑定会带来相当大的开销。

有简单的对策来确保互操作程序集可用:

  • 要求您的用户安装Office主互操作程序集(PIA)。

  • 实际上需要一个PIA是非常罕见的,只有当你在自己的公共方法中公开一个Officetypes并在另一个程序集中使用它时才是必要的。 在参考节点中selectMicrosoft.Office.Interop程序集,并将其“复制本地”属性设置为true。 重build,你会得到你的生成目录中的那些程序集。 将它们与您自己的可执行文件一起复制到客户机。

  • VS2010及以上的解决scheme都有这个部署细节。 在“参考”节点中select互操作程序集,并将“embedded互操作types”属性设置为True。 互操作声明现在将被合并到您自己的可执行文件中,您不必再部署互操作程序集或PIA。

由于您接受了VS2010及更高版本的dynamic解决scheme,最后一个项目符合您的要求。