1

在使用 .Net 库项目的某个时刻,我总是面临以下问题:我必须将诸如 dll 之类的资源复制到调用 .Net 库的程序中。

例如,我有一个库可以进行一些声音处理。我有一个引用库项目的消费者程序(称之为测试项目)。在库项目中,我使用调用 c++ dll 的 ac# 包装类。我还有一个带有某些字符串的 .config 文件。我面临以下问题:

当测试项目调用库时,我得到 DllNotFound 异常。C# 包装器找不到 c++ dll。因此,我将 c++ dll 复制到测试项目中的某些文件夹(root、bin、bin/debug),直到 DLLNotFound 异常被“修复”(显然,我不确定它需要存储在哪里)。我还需要将 .config 文件从库复制到测试项目,尽管我在 Visual Studio 中设置了属性“如果较新则复制”。

我在说包含我需要运行的 SQL 命令的文本文件时遇到了类似的问题。所以我的库项目中有一个名为“commands.sql”的文件,我通过以下方式调用它:

//example
public static class Configurator
{
    private static string _basePath = String.Empty;

    public static string BasePath
    {
        get
        {
            if (_basePath == String.Empty)
            {
                var basePath = Environment.CurrentDirectory;
                var projectName = System.Reflection.Assembly.GetEntryAssembly().GetName().Name;
                basePath = basePath.Substring(0, basePath.LastIndexOf(projectName));
                _basePath = basePath + projectName;
            }

            return _basePath;
        }
    }
}


private static string LoadSqlScript()
{
    return System.IO.File.ReadAllText($"{Configurator.BasePath}\\scripts\\commands.sql");
}

但是当我从测试项目中调用它时,这不起作用。我仍然需要手动将脚本复制到调用程序。

处理这个问题的正确方法是什么?我一定是错过了什么,对吧?我希望不必发布构建脚本来“自动化”这个,对吧?

4

1 回答 1

0
  1. 您可能对以下链接感兴趣:https ://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order 。它包含有关当您将它们与 P/Invoke 一起包含在库中时如何搜索 DLL 的信息。

  2. 正确地,如果库没有安装在 1 中列出的众所周知的位置之一,那么您可能需要在构建中包含 DLL。为此,您可以通过 .NET 项目配置(然后触发正确的 MSBuild 目标)将它们设置为“复制到输出目录,如果更新”。

于 2021-06-18T11:20:57.067 回答