如何创建可从 Microsoft Access 调用的 .NET 程序集? 完全亏损

问题描述

我正在使用 C# 中的 .NET Framework 4.8 和 Visual Studio 2019 构建类库。

我想从 Access 2016 VBA 调用我的 .NET 类库中的函数

当我尝试从 VBA 调用函数时,出现以下错误

Run-time error '-2147024894 (800700002)':

Automation error
The system cannot find the file specified.
  • 自定义类库的参考已添加到 VBA 中的 Tools | References 下。
  • C# 程序集是在每个引用的程序集上使用 copy Local 选项构建的。
  • 我从管理员:命令提示符尝试了 SFC /SCANNow。这报告了一些 DLL 已被替换。 SFC /SCANNow 的后续运行报告未发现任何问题。
  • 引用的程序集都是 Microsoft .NET Framework 4.8 程序集。不涉及第三方 DLL。
  • 构建期间没有出现错误或警告。
  • 程序集标记COM Visible
  • 程序集已成功注册regasm

A 尝试了一些其他方法。还没有成功。

  • 我从头开始 - 并创建了一个 .NET Framework 4.72 DLL。
  • 程序集信息已选中“使程序集 COM 可见”。
  • 构建信息已选中“注册 COM Interop”。
  • 我成功地添加了对工具的引用 | VBA 编辑器中的参考。

现在我收到以下错误

Run-time error 429 activex component can't create object.

该类的代码如下:

using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.Runtime.InteropServices;

namespace NWBLibrary
{
    [ClassInterface(ClassInterfaceType.AutoDual)]
    public class ReedDecibelLogger
    {
        /// <summary>
        /// GetSha256filehash computes a SHA256 hash of a file.
        /// </summary>
        
        public string GetSha256filehash(string fileSpec)
        {
            string filehash = string.Empty;
            byte[] hashValue;

            SHA256 managedSha256 = SHA256.Create();

            FileStream fileStream;
            using (fileStream = new FileStream(fileSpec,FileMode.Open))
            {
                hashValue = managedSha256.ComputeHash(fileStream);
                fileStream.Close();
            }

            filehash = Convert.ToBase64String(hashValue);
            return filehash;
        }

    }
}

上述程序集的引用已添加到 VBA 编辑器的 Tools | References 部分。

VBA References for .NET Class Library.

VBA 代码是:

' Returns the SHA256 near unique hash for the specified file.
Public Function filehash(ByVal fileSpec As String) As String

   Dim loggerObj As New NWBLibrary.ReedDecibelLogger

   filehash = loggerObj.GetSha256filehash(fileSpec)

End Function

我的问题是:

  1. .NET 程序集(自定义和引用)应位于何处,以便 VBA 可以找到所有必需的 DLL?
  2. 我是否需要修改开发框上的搜索路径,以便 Access VBA 可以找到 DLL?
  3. 这是否是 Microsoft 程序集所依赖的程序集,但在使用 copy Local 时不包括在内?
  4. 我是否应该使用 Fusion 日志查看器 (fuslogvw.exe) 来查看是否缺少依赖程序集?
  5. 有人可以推荐一本讨论构建用于 VBA 的库的参考书或第三方书籍吗?
  6. 如果这是 CLR 没有看到所有依赖项的问题,您将如何使 GAC 和所有依赖项对 CLR 可见?
  7. 是否需要其他步骤才能让 VBA 看到程序集和 GAC?列表项?
  8. 我是否需要为 C# 程序集创建 DLL 入口点?
  9. 我需要尝试不同版本的 Microsoft Access 吗?
  10. 我可以让它在一个工作站上运行,但它在另一台工作站上失败并显示 429 错误。这可能是一个依赖性问题。

我正在使用 Fusion Logger 查看引发 429 错误的机器上是否缺少依赖项。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)