如果想让 Visual C# 项目中的代码与 Visual Basic for Applications (VBA) 代码相互交互,则可以向后者公开前者。
Visual C# 进程不同于 Visual Basic 进程。有关更多信息,请参见如何:向 VBA 公开 Visual Basic 项目中的代码。
**适用于:**本主题中的信息适用于以下应用程序的文档级项目:Excel 2013 和 Excel 2010;Word 2013 和 Word 2010。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
公开 Visual C# 项目中的代码
若要使 VBA 代码能够调用 Visual C# 项目中的代码,请修改代码使其对于 COM 可见,然后在设计器中将**“ReferenceAssemblyFromVbaProject”属性设置为“True”**。
有关演示如何从 VBA 中调用 Visual C# 项目中的方法的演练,请参见演练:在 Visual C# 项目中调用 VBA 中的代码。
向 VBA 公开 Visual C# 项目中的代码
打开或创建一个文档级项目,该项目须基于支持宏的 Word 文档、Excel 工作簿或 Excel 模板并且已经包含 VBA 代码。
有关支持宏的文档文件格式的更多信息,请参见结合 VBA 和文档级自定义项。
说明
此功能无法在 Word 模板项目中使用。
确保在不提示用户启用宏的情况下允许运行文档中的 VBA 代码。通过在 Word 或 Excel 的“信任中心”设置中将 Office 项目的位置添加到受信任位置列表中,可以信任要运行的 VBA 代码。
将希望向 VBA 公开的成员添加至项目中的公共类,并将新成员声明为 public。
将以下 ComVisibleAttribute 和 ClassInterfaceAttribute 特性应用于要向 VBA 公开的类。这些特性使类对于 COM 可见,但不生成类接口。
[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
重写项目中宿主项类的 GetAutomationObject 方法以返回要向 VBA 公开的类的实例:
如果要向 VBA 公开宿主项类,请重写属于此类的 GetAutomationObject 方法,并返回类的当前实例。
protected override object GetAutomationObject() { return this; }
如果要向 VBA 公开非宿主项的类,请重写项目中任一宿主项的 GetAutomationObject 方法,并返回非宿主项类的实例。例如,以下代码假设要向 VBA 公开一个名为 DocumentUtilities 的类。
protected override object GetAutomationObject() { return new DocumentUtilities(); }
有关宿主项的更多信息,请参见宿主项和宿主控件概述。
从要向 VBA 公开的类中提取接口。在**“提取接口”**对话框中,选择希望包括在接口声明中的公共成员。有关更多信息,请参见提取接口重构 (C#)。
将 public 关键字添加到接口声明中。
通过将以下 ComVisibleAttribute 特性添加到接口中以使接口对 COM 可见。
[System.Runtime.InteropServices.ComVisible(true)]
在 Visual Studio 的设计器中打开文档(Word 文档)或工作表(Excel 工作表)。
在**“属性”窗口中,选择“ReferenceAssemblyFromVbaProject”属性,并将值更改为“True”**。
说明
如果工作簿或文档尚未包含 VBA 代码,或者运行文档中的 VBA 代码时不信任该代码,则在将“ReferenceAssemblyFromVbaProject”属性设置为“True”时将收到一条错误消息。这是因为在这种情况下 Visual Studio 无法修改文档中的 VBA 项目。
在显示的消息中单击**“确定”**。此消息提醒您在从 Visual Studio 中运行项目时如果将 VBA 代码添加到工作簿或文档中,则在下一次生成该项目时 VBA 代码将丢失。这是因为每次生成项目时都会覆盖生成输出文件夹中的文档。
此时,Visual Studio 会配置项目,以便 VBA 项目可以调入程序集。Visual Studio 还将名为 GetManagedClass 的方法添加到 VBA 项目。可以从 VBA 项目的任何位置调用此方法以访问向 VBA 公开的类。
生成项目。
请参见
任务
如何:在 Visual Studio 中创建 Office 项目
如何:向 VBA 公开 Visual Basic 项目中的代码