【问题标题】:Calling a running C# application from VBA从 VBA 调用正在运行的 C# 应用程序
【发布时间】:2011-02-03 04:47:44
【问题描述】:

我有一些需要与正在运行的 c# 应用程序对话的 VBA 代码。 值得一提的是,c# 应用程序作为服务运行,并通过 .net 远程处理公开接口。

我发布了一个关于我已经遇到的特定问题的问题 (From VB6 to .net via COM and Remoting...What a mess!),但我认为我的结构可能完全错误...

所以我要退后一步 - 这样做的最佳方法是什么? 值得考虑的一件事是我想调用正在运行的应用程序 - 而不仅仅是调用预编译的 DLL...

【问题讨论】:

    标签: c# .net vba com interop


    【解决方案1】:

    过去,我完成类似事情的一种方法是使用Microsoft Message Queueing。两种语言/平台都可以读取/写入队列。

    在我的场景中,我们有一个必须维护的旧版 Access 数据库。我们希望摆脱它,并用更强大的 .NET 解决方案取而代之。为了从当前系统中获取实时数据到新系统中,我们添加了 VBA 代码来将数据写入消息队列。然后我们编写了一个 C# windows 服务来处理新系统中的数据。

    我不完全确定你在做什么,所以这可能不合适,但我想我会提一下。

    【讨论】:

    • 嘿 - 谢谢你的建议。除非没有其他办法,否则我宁愿不必编写/维护任何 VBA 代码。对于这个解决方案,我必须定义一堆消息类型,并在两端(c# 和 vba)编写一些代码来打包/解包消息。
    【解决方案2】:

    我已经用我原来的结构想出了一个解决方案...

    也就是说,VBA 应用程序调用一个 COM 包装器应用程序,它将所有类型从 .Net 转换为 COM 安全类型。然后这个包装器使用 .net 远程调用主服务。

    我遇到的问题是包装器和服务之间的通用 dll 需要位于 C:\Program Files\Microsoft Office\Office12 文件夹中(与 msaccess.exe 一起)。

    当我使用 AssemblyResolve 方法在运行时提供 dll 时,这不起作用...所以现在我只需要将 dll 复制到文件夹中 - 这远非优雅的解决方案,但在至少目前通信正常。

    【讨论】:

      猜你喜欢
      • 2015-09-21
      • 1970-01-01
      • 2011-05-07
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多