Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET与Microsoft Access对话-可以进行回调吗?_Vb.net_Ms Access_Callback_Vba - Fatal编程技术网

VB.NET与Microsoft Access对话-可以进行回调吗?

VB.NET与Microsoft Access对话-可以进行回调吗?,vb.net,ms-access,callback,vba,Vb.net,Ms Access,Callback,Vba,我正在VB.NET(特别是Visual Basic)中构建一个附加UI系统,该系统使用传统Microsoft Access系统中的数据(至少在一段时间内,需要通过其旧的内部UI使用这些数据)。在VB.net中,我可以做几乎所有我需要做的事情——处理数据表,调用包含适当功能的访问函数,等等 我想弄清楚的是,Microsoft Access是否可以调用VB.NET(例如,可能允许我传入要调用的函数引用) 具体的动机是,有2到3个耗时的Microsoft Access函数可以生成关键的输出数据-如果您

我正在VB.NET(特别是Visual Basic)中构建一个附加UI系统,该系统使用传统Microsoft Access系统中的数据(至少在一段时间内,需要通过其旧的内部UI使用这些数据)。在VB.net中,我可以做几乎所有我需要做的事情——处理数据表,调用包含适当功能的访问函数,等等

我想弄清楚的是,Microsoft Access是否可以调用VB.NET(例如,可能允许我传入要调用的函数引用)

具体的动机是,有2到3个耗时的Microsoft Access函数可以生成关键的输出数据-如果您通过MS Access界面直接调用它们,您会看到进度条和工作阶段表单上偶尔的文本更新,即进度%,等。如果从VB.net调用,我可以修改MS Access代码,不做这些事情,但我真的希望MS Access代码返回到VB.net,这样我可以在新界面中提供一些进度反馈

一个优雅的解决方案是,如上所述,让VB.NET在函数委托中传递MS访问调用-但由于这些是完全不同的内存空间等,我认为需要一些内部框架来实现这一点-可能以某种方式通过共享DLL。我可以使用旧的“轮询”路线,其中MS Access将状态写入一个表,而(异步)VB.NET应用程序轮询该表并使用其中的内容。这似乎是一种不雅的黑客行为,不必要地浪费资源,而且可能容易出现bug,我讨厌走这条路。如果我能构建一个MS-Access可以使用的函数,只需返回一个状态字符串,我想这将涵盖绝大多数情况


任何建议都是非常受欢迎的。

我经常在.net中创建COM对象,以便与Access一起使用。因此,在您的访问代码中,您可以很肯定地让流程循环“调用”.net对象来更新流程

但是,您可能正在自动化Access的副本,因此希望Access调用现有自动化客户端中的例程,而不是Access实例调用自定义.net对象。然而,我认为构建一个自定义的.net对象将是最少的工作和麻烦。换句话说,你可以改变你的方法。首先启动Access,它将.net应用程序用作COM对象。这样,应用程序中的任何例程都可以使用,并且可以从Access VBA调用

如果主.net应用程序确实需要从Access接收消息,而不是Access使用自定义的.net对象简单地调用+来显示流程信息,那么我之所以要实现回调,唯一的原因是。(因此很容易构建一个.net对象来显示进度)

因此,最好的办法是采用将现有应用程序转换为COM对象以供Access使用的想法。这很容易

一旦你做到了以上,那么

Access首先启动,然后创建应用程序的实例。(因此可以从VBA调用/使用.net应用程序中的任何.net子组件或函数)

即使您不首先启动Access,启动时Access也可以获取应用程序的运行实例(就像您可以在Access/VBA中获取Excel或Word的运行实例一样)

最后但并非最不重要; 您可能可以实现回调,但我不知道如果不创建一个.net COM对象作为中间人,这是否可行。因此,最好还是选择一个正在运行的.net应用程序实例进行访问

因此,我将把您的.net应用程序公开为一个COM不稳定对象

因此,最少的工作量是创建access使用的单独的.net COM对象,但如果您将来假设VBA应该能够调用任何vb.net例程,那么我将只将您的.net应用程序构建为一个可消费的COM对象