You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在项目中正确引用依赖其他DLL的自定义DLL

如何在项目中正确引用依赖其他DLL的自定义DLL

我完全懂你的困扰——明明只想引用自己写的A.dll,结果每次都得额外安装它依赖的B、C两个NuGet包,确实挺麻烦的。结合你的场景,给你几个实用的解决方案,你可以根据自己的项目情况来选:


1. 把A.dll做成NuGet包(最推荐的规范做法)

这是长期来看最省心的方式,因为NuGet天生就支持依赖传递。你只需要给A.dll创建一个自己的NuGet包,在包的配置里声明它依赖的B、C两个NuGet包,这样别人安装你的A.dll包时,NuGet会自动帮你把B、C也装上,完全不用手动操作。

简单操作步骤:

  • 在A.dll的项目目录下新建一个.nuspec文件,内容大概是这样(根据你的实际框架版本、包信息调整):
    <?xml version="1.0"?>
    <package >
      <metadata>
        <id>YourTeam.A</id>
        <version>1.0.0</version>
        <authors>你的名字/团队名</authors>
        <description>自定义业务组件A,依赖B和C组件</description>
        <dependencies>
          <group targetFramework=".NETFramework4.8">
            <!-- 这里填B、C的NuGet包ID和版本范围 -->
            <dependency id="B" version="[2.0.0, 3.0.0)" />
            <dependency id="C" version="[1.5.0]" />
          </group>
        </dependencies>
      </metadata>
      <files>
        <!-- 指定要打包的A.dll路径 -->
        <file src="bin\Release\A.dll" target="lib\net48" />
      </files>
    </package>
    
  • 打开命令行,进入该目录,运行nuget pack命令生成NuGet包。之后你可以把这个包传到私有NuGet源,或者直接在本地使用——ProjectWPF安装这个包时,B、C会自动被下载并引用。

2. 手动复制依赖DLL到输出目录(临时应急方案)

如果只是临时测试或者小项目不想折腾NuGet,那你可以把B.dll和C.dll从A项目的bin\Release目录(或者你安装NuGet包的packages文件夹里找到它们)复制到ProjectWPF的根目录,然后选中这两个DLL,在属性里把复制到输出目录设为「如果较新则复制」。这样运行时,输出目录里就会有A、B、C三个DLL,程序就能找到它们了。

不过这个方法比较繁琐,每次A.dll更新后可能需要同步检查B、C的版本,适合临时用用。


3. 用项目引用替代DLL引用(同解决方案场景)

如果你的A.dll项目和ProjectWPF在同一个解决方案里,别直接引用编译好的A.dll,而是直接添加对A项目的引用。这样Visual Studio会自动识别A项目的依赖,把B、C的DLL自动复制到ProjectWPF的输出目录,完全不用手动处理依赖。


4. 把依赖DLL嵌入到A.dll中(特殊场景适用)

如果不想让用户看到额外的DLL文件,你可以把B.dll和C.dll作为嵌入资源加到A项目里,然后在A.dll的代码里写一段逻辑,程序启动时把嵌入的DLL提取到输出目录。

示例代码大概是这样(可以放到A.dll的静态构造函数里):

static class DependencyLoader
{
    static DependencyLoader()
    {
        // 提取嵌入的B.dll
        ExtractEmbeddedDll("YourNamespace.B.dll", "B.dll");
        // 提取嵌入的C.dll
        ExtractEmbeddedDll("YourNamespace.C.dll", "C.dll");
    }

    private static void ExtractEmbeddedDll(string resourceName, string outputFileName)
    {
        var outputPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, outputFileName);
        // 已经存在就不用重复提取
        if (File.Exists(outputPath)) return;

        using (var resourceStream = typeof(DependencyLoader).Assembly.GetManifestResourceStream(resourceName))
        {
            if (resourceStream == null)
                throw new FileNotFoundException("找不到嵌入的依赖DLL", resourceName);
            
            using (var fileStream = new FileStream(outputPath, FileMode.Create))
            {
                resourceStream.CopyTo(fileStream);
            }
        }
    }
}

注意:这个方法只适合简单的托管DLL,如果B、C是原生DLL或者有复杂依赖链,可能会出问题,而且要注意保持嵌入的DLL版本和A.dll依赖的版本一致。


另外补充一下你提到的LocalCopy属性:它只会把你引用的A.dll复制到输出目录,但Visual Studio不知道A.dll依赖哪些其他DLL(除非通过NuGet或项目引用管理),所以不会自动复制B、C,这就是为什么你设了LocalCopy还是报错的原因。

备注:内容来源于stack exchange,提问作者mr_noisette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 10:14:31