描述

我写了几Excel Udf在COM服务器。我想得到的标准帮助(插入功能 对话),你当你的新闻 外汇.是的,我可以看到我COM中列出的服务器之间的类别下降了下来,但是

  • 我也看到平等,GetHashCode,GetType,并ToString(这是相当不希望暴露的Excel用户),
  • 选择我COM服务器带来了*Function Arguments*[1]对话与没有参数的信息并且没有说明的功能。

这里是跛行,我得到:

插入对话功能http://www.iwebthereforeiam.com/files/Insert%20function%20dialog.gif

Excel功能的参数对话http://www.iwebthereforeiam.com/files/Function%20Arguments%20dialog.gif

这个问题

都在那里。净属性,我可以把该方法通过这一通过,以Excel?

  • 我可以提供说明的功能吗?
  • 我可以提供说明的参数?
  • 我可以提供一个类别的名字我的功能,从而使我得到更好的东西不仅仅是该进程id?

(我看看,它看起来可悲的是很容易做到在ExcelDNA,但我不会去那的路线。模仿govert的代码[自定属性,一种加载程序的某一类,等等。] 看起来喜欢这将是相当困难。)


其他背景

如果你还没有完成的工作的Excel+COM服务器之前,这里有一些有用的资源得到最多的速度:

以前的计算器问题:
如何获得COM服务器,用于Excel写VB.NET 安装,并登记自动化服务器名单?
如何加COM-暴露出来。净项目的维生素b6(或VBA)引用对话?

其他资源:
书写用户自定义功能,用于Excel。净
建立和部署。净COM会
编写定制的Excel工作表职能在C#


编辑2009-10-20 14:10

我试过叫出来 Application.MacroOptions 在一个 Sub New().

  1. 没有子新()
    半可以接受的:功能是下所列类别进程id.
  2. 共享子新()
    不可接受的:建立时的错误。
    Cannot register assembly "...\Foo.dll".
    Exception has been thrown by the target of an invocation.
  3. 子新()
    不可接受的:类别是不列在插入功能的对话。

我怀疑这是一个问题,既为MacroOptions和更多的参与途径的建议通过查尔斯。


编辑2009-10-20 14:55

另一方面,迈克的建议,即创建一个接口,以实现没有杀死了烦人的额外方法暴露出来。


编辑2009-10-20 15:00

这Microsoft的文章 从2007年初(通过 迈克的链接)似乎是一个相当完整的答案的主题:

自动化加入和功能 向导

每个自动化程序具有其自己的 类别中的Excel功能的向导。该类别的名称进程id为 添加;你不能指定一个 不同的类别,名为自动化 加功能。此外,还有 是没有办法指定的功能 描述论点说明, 或者有助于自动化加在 职能功能的向导。


1 嗯,一个计算器的错误。它看起来像你无法斜体字符串的内部明确HTML ul-名单?

有帮助吗?

解决方案

这些是容易纠正,其他部分的它是相当艰难。所有的这是可行的,不过,如果你愿意把时间。

你写道:

我也看到平等,GetHashCode, GetType,并ToString(这是 相当不希望暴露的 Excel的用户)

是的,一致,这绝对不希望的,但它可以预防的。这是发生,因为你的类继承'系统。目',作为所有。净类做的,你的默认接口,暴露于COM包括这些成员。发生这种情况,例如,如果您使用的'支持',使用设置'ClassInterfaceType.AutoDual'.

E.g。在C#:

[ClassInterface(ClassInterfaceType.AutoDual)]

在VB.NET:

<ClassInterface(ClassInterfaceType.AutoDual)>

使用'ClassInterfaceType.AutoDual'应该是可以避免的,但是,为了防止该成员继承了'系统。目'接触(以及防止潜在的版本控制问题在未来).相反,定义自己的接口,实现接口在类,然后标志类的'ClassInterface'的属性与一个值'ClassInterfaceType.None'.

E.g., 使用C#:

[ComVisible(true)]
[Guid("5B88B8D0-8AF1-4741-A645-3D362A31BD37")]
public interface IClassName
{
    double AddTwo(double x, double y);
}

[ComVisible(true)]
[Guid("010B0245-55BB-4485-ABAF-46DF4356DB7B")]
[ProgId("ProjectName.ClassName")]
[ComDefaultInterface(typeof(IClassName))]
[ClassInterface(ClassInterfaceType.None)]
public class ClassName : IClassName
{
    public double AddTwo(double x, double y)
    {
        return x + y;
    }
}

使用VB.NET:

<ComVisible(True)> _
<Guid("5B88B8D0-8AF1-4741-A645-3D362A31BD37")> _
Public Interface IClassName
    Function AddTwo(ByVal x As Double, ByVal y As Double) As Double
End Interface

<ComVisible(True)> _
<Guid("010B0245-55BB-4485-ABAF-46DF4356DB7B")> _
<ProgId("ProjectName.ClassName")> _
<ComDefaultInterface(GetType(IClassName))> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class ClassName
    Implements IClassName

    Public Function AddTwo(ByVal x As Double, ByVal y As Double) As Double _
        Implements IClassName.AddTwo
        Return x + y
    End Function
End Class

通过使用'ClassInterfaceAtribute'价值'ClassInterfaceType.没有,继承'系统。目'承包商,客人都排除在外,因为该类的接口是不COM-可见的。相反,只有实现接口('IClassName',在这个例子)出口到COM.

上面也使用'ComDefaultInterfaceAttribute'.这不是很重要的,并且没有什么如果你仅实施一个接口--作为在这个例子--但是它是一个好主意的情况下添加一个接口后,如IDTExtensibility2.

更多详细信息,见:

(1) 管理自动加载 安德鲁*怀特查佩尔.

(2) 编写定制的Excel工作表职能在C# 通过Gabhan浆果。

好了,现在到最难的部分。你写道:

选择我COM服务器带来了 Function Arguments[1]对话与没有参数的信息和没有 说明的功能。

我可以提供一个说明 功能?

我可以提供一个说明 参数?

我可以提供一个类别的名字我的 功能,从而使我得到的东西 好的不仅仅是程序id?

最简单的办法是使用 应用程序。MacroOptions 法。这种方法可以提供说明的功能,并指定其类别下,你想要它来显示。这种做法并不允许指定的任何信息功能的参数,很不幸,但技术,允许你这样做是非常复杂,其中我将得到以后。 [修正:该应用程序。MacroOptions'的方法仅适用于Udf创建的通过VBA,并且不能被用于自动化应用程序。阅读关于更复杂的办法来处理登记的Udf集装箱是不能完全填充,在一个自动加载项--迈克*罗森布2009.10.20]

注意, 帮助文件Excel2003年帮助文件Excel2007年 国家一串可以提供给类参数,以便提供一个定制的类别名称的选择。要注意的是, 帮助文件Excel2002年 不这样做。我不知道如果这是一个遗漏在Excel2002年帮助的文件,或者如果这是一个新的能力作的Excel2003年。我猜是后者,但是你必须试验是肯定的。

只有这样,才能得到你的参数的信息,进入功能的向导是使用一个相当复杂的技术涉及的'Excel。应用程序。ExecuteExcel4Macro'的方法。即使被警告:许多Excel Mvp有挣扎,这种做法并未能产生的结果是可靠的。最近,虽然,它的出现,扬*卡雷尔*Pieterse(JKP)已经得到了它的工作和已公布的详细信息: 注册用户自定义功能,用Excel.

撇那篇文章你会看到,这不是微弱的心脏。一部分问题是他写的VBA/VB6.0和因此,所有代码将被翻译成VB.NET 或C#。关键的命令,但是,是'Excel。应用程序。ExecuteExcel4Macro'的方法,这是露出来。净,所以一切都应该工作的罚款。

作为一个实际问题,但是,我截然更喜欢使用Excel。应用程序。MacroOptions'的方法,因为它是简单而可靠。它没有提供参数的信息,但我们尚未有一个强烈的需要激励我的'ExecuteExcel4Macro'的方法。

那么,祝你好运用这一点,但我的建议会使用的'MacroOptions',除非你们是按小时支付。;-)

--迈克

后续行动的休的答复

我试过叫出来 应用程序。MacroOptions在一个子 新的().

没有子新()半可以接受的:功能 下列出的分类程序id.

共享子新()不可接受的:建立时的错误。不能注册 大会"...\Foo.dll".异常 被扔通过的目标的一个 调用。

子新()不可接受的:类别 不列中插入功能的对话。我怀疑这是一个问题,既为 MacroOptions和更多的参与 路线建议的由查尔斯。

你不能使用的共用(又名"静态")的课程,或造时暴露你的类COM因为COM没有的知识这一概念,并使它无法汇编--为你找到了!你可能能够适用于'对象'价值'False'共享的构造,至少允许它编译。但这不会帮助你在这种情况下无论如何...

试图注册自动化加在通过自动化程序本身可能证明是非常棘手。我认识到,这是可取的,以便保持它作为一个单一的、独立的组成部分,但它可能是不可能的。或至少在这不会是容易的。

问题是,自动加载项要求载入。也就是说,他们是不是真的在那里,直到Excel试图访问的第一个工作表的职能从你的自动化程序。有两个相关的问题:

(1)如果你把你的注册码以内的构造你的课,然后,通过的定义,你能导的信息无法直存在,直到的功能已经被称为第一次。

(2)你的构造可能执行时Excel是没有准备好接受自动化的命令。例如,一个自动化程序通常要求装载时的用户开始的一个用户定义的职能(Udf)中所定义的自动化程序。结果是,该单元是在编辑模式的时候你的自动化加在第一个载荷。如果你有自动化的代码,在你的构造期间的编辑方式,许多命令将失败。我不知道如果'。应用程序。MacroOptions'或'Excel。应用程序。Excel4Macro'方法还有一个问题,但许多命令将扼当试图去执行,而该单元是在编辑模式。如果自动化程序载于第一时间,因为它是正在被调,而功能的向导是开放的,我不知道如果这些方法可以工作的权利。

没有简单的解决方案,以此如果你希望有你的自动化加在完全独立,没有其他的支持。但是,您可以创建一个管理COM加,将注册自动化加在于你通过'Excel。应用程序。MacroOptions'或'Excel。应用程序。Excel4Macro'的做法,当Excel中开始。管理COM加班可以在同一会,你的自动化程序,所以你还是只需要一个大会。

顺便说一句,你甚至可以用VBA工作簿。XLA加在做同样的--使用的工作簿。打开事件在VBA叫登记的代码。你只需要 的东西 叫你的注册码在Excel中开始。利用VBA在这种情况是,你可以利用的代码,从扬卡雷尔*Pieterse的 注册用户自定义功能,用Excel 文章,而不必翻译。网。

另一方面,迈克的 建议创建一个接口 要实现没有杀死了烦人的 额外的方法暴露出来。

哈哈,我很高兴的东西了!

这Microsoft的文章,从2007年初 (通过麦克的链接),似乎一个宁 完整的答案的主题:

自动化加入和功能 向导

每个自动化程序具有其自己的 类别中的Excel功能的向导。该类别的名称进程id为 添加;你不能指定一个 不同的类别,名为自动化 加功能。此外,还有 是没有办法指定的功能 描述论点说明, 或者有助于自动化加在 职能功能的向导。

这是一个限制的'。应用程序。MacroOptions'的做法只。(我的道歉,我忘了有关此限制的'。应用程序。MacroOptions'法关于自动加载的时候,我写了我原来的答案,同上。) 更复杂'。应用程序。ExecuteExcel4Macro'的做法,然而,绝对不工作自动化应用程序。它还应的工作。网("管理")自动加载,因为Excel不知道它是否载COM自动化增加创建的通过VB6.0/C++与管理COM自动化加在创造了使用VB.NET/C#.该机制是完全相同,从COM边的围栏,因为Excel不知道是什么。网络,或那样。净甚至存在。

这就是说,'Excel。应用程序。Excel4Macro'的做法肯定会是很多的工作。

其他提示

你可以使用一个。净Excel系统,例如ExcelDNA或ADDIN表达,或者尝试适应的一个VBA/维生素b6方案:看看Laurent Longre的FunCustomise http://xcell05.free.fr/english/index.html 或者扬*卡雷尔*Pieterse的文章 http://www.jkp-ads.com/Articles/RegisterUDF00.asp 它使用一种功能负载过重的黑客.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top