gpt4 book ai didi

c# - VBA、MS Access 和外部应用程序

转载 作者:行者123 更新时间:2023-11-30 12:32:53 24 4
gpt4 key购买 nike

我有一个 MS Access 数据库,上面有一个按钮,可以运行我编写的工具。该工具有效。 Access 数据库有效。运行该工具的 VBA 有效。

但是,从 VBA 运行该工具时会出现问题。它总是在尝试加载 XML 配置数据时崩溃。我通过检查我的错误报告工具(控制面板 -> 管理工具 -> 事件查看器)对此进行了测试。我还编写了我的工具的第二个版本,其中包含所有硬编码的 XML 数据。

我想知道发生这种情况是否有已知原因,以及是否有解决此错误的可行解决方案。硬编码我的所有配置数据并不是真正理想的解决方案,因为配置数据需要在无需重新编译整个项目和推出更新的情况下进行修改。

信息:

  • MS Access 2010 with Visual Basic for Applications(使用 Shell申请调用)
  • 使用引用(IO、Linq、Xml.Linq、Data.OleDb、全局化)的 XML 配置数据的 C# 应用程序

感谢您提供的任何帮助。

根据请求,这是我用来运行应用程序的代码:

Dim hProcess As Long
Dim myPath As String
dim myFile As String

myPath = Environ("ProgramFiles(x86)" & "\mytool\"
myFile = "mytool.exe"

hProcess = Shell( myPath & myFile, vbNormalFocus )

该应用程序是一个 WinForms 应用程序,允许用户将 csv 中的列名称映射到 Access 中的字段。唯一实际的问题是它尝试加载 XML 配置数据的部分:

XDocument xDoc = XDocument.Load(Environment.CurrentDirectory + "\\config.xml");

同样,如果我将配置数据硬编码到应用程序本身,则在运行应用程序时完全没有问题。但是,如果我尝试加载 XML 配置数据,它会在事件查看器中给出一个错误事件,指出加载 XML 文件时出现未处理的异常。如果我在 VBA Shell 调用之外运行应用程序,它运行良好并且可以加载 XML 文件。它只会在尝试从 VBA Shell 加载 XML 时崩溃。

最佳答案

根据我的经验,从 MS Access 执行 .NET 代码似乎会“搞乱”一些 .NET 的“获取当前目录”方法,如果您在没有 Access 的情况下直接运行完全相同的 .NET 应用程序,这些方法都可以正常工作。

如果您想了解我在说什么,请在 Visual Studio 中创建一个新的控制台应用程序并粘贴以下代码:

using System;
using System.IO;

namespace CurrentDirTest
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Environment.CurrentDirectory);
Console.WriteLine(Directory.GetCurrentDirectory());
Console.WriteLine(System.Threading.Thread.GetDomain().BaseDirectory);
Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
Console.ReadLine();
}
}
}

当我直接从 Visual Studio 运行它时,它输出如下(如预期的那样):

C:\Dev\Code\CurrentDirTest\CurrentDirTest\bin\Debug
C:\Dev\Code\CurrentDirTest\CurrentDirTest\bin\Debug
C:\Dev\Code\CurrentDirTest\CurrentDirTest\bin\Debug\
C:\Dev\Code\CurrentDirTest\CurrentDirTest\bin\Debug\

现在将已编译的 .exe 放入您的 Program Files (x86)\mytool\ 文件夹中,并尝试使用您问题中的 VBA 代码从 Access 中调用它。

当我在我的机器上这样做时,我得到了这个:

C:\Users\MyUserName\Documents
C:\Users\MyUserName\Documents
C:\Program Files (x86)\mytool\
C:\Program Files (x86)\mytool\

很奇怪,不是吗?
Environment.CurrentDirectoryDirectory.GetCurrentDirectory() 都会在从 MS Access 执行应用程序后立即返回我的“Documents”文件夹。
我不知道为什么会这样,但确实如此。

解决方案:
如果您在您的机器上得到的结果与我在我的机器上得到的结果相同,那么您的问题的解决方案很简单:只需使用 System.Threading.Thread.GetDomain().BaseDirectoryAppDomain.CurrentDomain .BaseDirectory 获取当前目录。


以防有人在使用 COM-Interop 时遇到类似问题:当您从 MS Access 通过 COM-Interop 执行 .NET 程序集时,问题会更糟。
如果我没记错的话,System.Threading.Thread.GetDomain().BaseDirectoryAppDomain.CurrentDomain.BaseDirectory 都不适合我,因为它们都返回了目录msaccess.exe.
我必须使用 this.GetType().Assembly.Location 来获取 .NET 程序集的实际位置。

关于c# - VBA、MS Access 和外部应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654160/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com