自动化加载项与COM加载项 - c#

我是外接程序编程的新手,在以下情况下需要帮助:

我有一个C#Excel自动化加载项,它调用了几个UDF。我想在加载自动加载项时进行用户名和密码检查,在加载加载项时必须弹出用户可以输入其详细信息的屏幕。如何使用自动化加载项来完成?

通常如何使用自动化插件来完成事件处理?我希望在用户按F9键以计算某些单元格中的UDF公式时进行一些计算。

是否有任何文章解释自动化加载项中的事件处理?

参考方案

通常,自动化外接程序不是设计用于处理这种功能的。您可以使您的加载项实现IDTExtensibility2以获得对运行该加载项的'Excel.Application'对象的引用。从那里,您可以访问“ Excel.Application”类的所有事件。但是,自动化加载项通常不设计为处理Excel对象模型事件-而是设计为仅支持用户定义函数(UDF)。

我要输入用户名和密码
检查何时自动加载项
加载哪个屏幕
用户可以输入他的详细信息必须弹出
在加载项上加载。怎么可能
使用自动化插件完成?

当您首次加载自动化加载项时,请当心尝试采取措施。自动化加载项是按需加载的,这意味着直到Excel需要它才加载。通常,它将在用户开始将自动化加载项的第一个用户定义功能(UDF)输入单元格时加载。问题在于,当用户仍在编辑单元格时尝试执行时,大多数编程命令将失败。因此,如果您在首次加载外接程序时尝试执行此类操作,则很有可能在Excel处于不允许代码安全执行的模式下加载该加载项。 (有关更多信息,请参见:Excel fails when Automation add-In loads。)

要解决此问题,可以改用托管的COM加载项,该加载项旨在处理Excel对象模型事件。如果需要,您的托管COM加载项甚至可以加载自动化加载项。或托管COM加载项类和自动化加载项类都可以驻留在同一程序集中,在这种情况下,它们可以直接进行通信。

如何处理事件
一般使用自动化插件?一世
希望在什么时候做一些计算
用户按F9计算
udf公式在某些单元格中。

可以通过预订'Excel.Application.SheetCalculate'事件来检测何时按下F9键,该事件将在任何工作表完成计算时触发。在这种情况下,可以出于任何原因触发计算-不仅是按F9键。如果您希望专门捕获F9键,则需要利用“ Application.OnKey”回调,该回调仅可通过VBA使用。但是,您可以将项目中的类公开给COM,并从“ Application.OnKey”事件调用的VBA加载项中对其进行调用。

有关自动化加载项的文章,请参见:

Writing user defined functions for Excel in .NET
Writing Custom Excel Worksheet Functions in C#
Implementing IDTExtensibility2 in an Automation Add-in
Excel fails when Automation add-In loads
How to Deploy a .NET Automation Add-in via a Visual Studio Setup Package

有关托管COM加载项的文章,请参见:

How to build an Office COM add-in by using Visual C# .NET
Building Microsoft Office Add-ins with Visual C# .NET and Visual Basic .NET

有关COM加载项和自动化加载项的文章,请参见:

Excel COM add-ins and Automation add-ins
Build and Deploy a .NET COM Assembly

有关讨论使用VBA加载项调用托管应用程序的文章,请参阅:

A Simple C# DLL - how do I call it from Excel, Access, VBA, VB6?
How to create Excel UDFs in VSTO managed code
Calling a .NET Component from a COM Component

我知道要消化的东西很多,但是希望这可以帮助您前进。总的来说,我建议使用托管的COM加载项来处理用户界面功能。托管COM加载项保存的数据可以轻松地与自动化加载项共享,方法是使两个加载项都引用同一程序集,或者使托管COM加载项类和自动化加载项都可以。在同一大会上举行的课堂上。

希望对您有所帮助,请询问您是否希望我进一步澄清。

-迈克

后续回复:

非常感谢您提供的链接和指针。我浏览了链接,并对需要完成的事情有一个很清楚的了解。

很高兴能帮到您。 :)阅读很多,我建议您打印并阅读所有内容。您正在寻求做的事情相当先进,因此您对该主题了解得越多,您的生活就会越好。

如果我使用基于COM的外接程序来处理excel事件,如何合并我的UDF函数?

托管COM加载项无法公开UDF功能。您仍然需要一个自动化插件。但是,如果需要,托管的COM加载项类和自动化的加载项类都可以位于同一程序集中。因此,您的COM加载项可能会要求用户提供所需的信息,并且当运行其中的UDF时,这些值将对自动化加载项可用。

它们会像使用自动化插件一样在公式窗格中作为常规功能公开吗?

您的自动化加载项公开的UDF将自动包含在“插入功能”向导中,并与您的自动化加载项名称相匹配。但是,该说明将不会自动包含为Excel内置功能提供的信息。默认功能通常很好,但是如果您希望为“插入功能”向导提供更完整的信息,这本身就是一个复杂的话题。请参阅:Excel 2007 UDF: how to add function description, argument help。

说我需要调用一个公式getcube,该公式返回一个数字的多维数据集
public double getcube(double a){返回一个* a * a; }

当我的插件同时使用定义我的UDF的自定义接口和IDTExtensibility2时,如何处理这种情况?您可以举一个例子来说明这个案例吗?

到目前为止,根据您在此处显示的内容,我看不到需要实现IDTExtensibility2,您只需要一个标准的自动化插件。对于标准自动化加载项,您应该阅读Writing user defined functions for Excel in .NET和Writing Custom Excel Worksheet Functions in C#。有关如何为托管COM加载项实现IDTExtensibility2的讨论,请参见Implementing IDTExtensibility2 in an Automation Add-in。

有没有一种方法可以在自动化插件上实现IDTExtensibility2以获得对Excel.Application对象的访问权,或者我应该为其创建一个单独的COM插件?

您绝对可以直接在自动化外接程序中实现IDTExtensibility2,而无需为此创建托管的COM外接程序。同样,请参见Implementing IDTExtensibility2 in an Automation Add-in。但是,您希望实现的是对Excel对象模型使用事件处理。尽管可以使用自动化外接程序完成此操作,但这不是标准的,也不是自动化外接程序设计要执行的任务。特别是,您希望在首次加载自动化加载项时让用户输入信息。这可能是一个特别棘手的情况,这就是为什么我建议您将托管COM加载项用于此任务的原因。有关更多信息,请参见Excel fails when Automation add-In loads。

为了明确起见,托管COM加载项和自动化加载项只是使COM可见并且已正确注册的类。没有理由为什么这两个类不能存在于同一程序集中。而且,由于听起来您希望功能同时包括UDF和Excel对象模型事件处理,因此同时包含托管COM加载项和自动化加载项的单个程序集将使您能够处理在其中寻求的所有功能。 Excel期望的方式。

我知道很多东西需要消化,但是如果您仔细阅读我在这里建议的文章,我认为这是有道理的...

麦克风

bulit-in gradle插件的版本号是多少? - java

在我的gradle构建文件中,我有以下插件块plugins { `java-library` jacoco checkstyle } 这些都没有指定版本,但是一切正常。假定一个项目正在使用gradle 6.0和gradle包装器,但是系统已安装gradle 5.0。问题:如果我运行gradle wrapper ./gradlew build,将会执行grad…

包括Java in Play! Scala源代码树杀死编译 - java

我正在使用Play!与Scala一起使用,并在源代码树中包括几个Java类。一切正常,直到我开始在树中直接包含源类。看来,每当我尝试使用app / com / class / class.java之类的文件夹编译应用程序时(仔细检查导入的结构是否正确),该应用程序都不会编译。它将在提示中启动,并进入“ API phase was ...”并挂起。我改编了一个…

Python基准测试:为什么for in loop比简单循环快? - python

我试图优化简单的字符计数功能。经过几次更改后,我决定检查时序,并期望使用基本的“ while”循环比“ for in”循环更快的功能。但是令我惊讶的是while循环比这里慢了30%!具有较低抽象度(内部较少)的简单“ while”循环难道不应该比“ for in”更快吗?import timeit def faster_count_alphabet(file…

调用fig.add_axes()时,Python内核在Jupyter笔记本中崩溃 - python

因此,我在Windows上运行的Anaconda具有很多东西,并且:Python 3.6.6matplotlib 2.2.3当我运行以下代码时,Python内核崩溃:import matplotlib.pyplot as plt fig = plt.figure(figsize=(10,10)) fig = plt.figure(figsize=(10,10…

List.Add()在C#中不起作用-吸气剂和吸气剂问题? - c#

我有这个属性:public virtual List<FieldImage> Images { get; set; } 如果我去获取具有此属性的类,则使用这样的实体从数据库中获取...Field field = this.unitOfWork.FieldRepository.GetByID(Convert.ToInt32(fieldID)); 然…