问题描述
.NET6.0的项目使用netstandard2.0版本的动态链接库。若是在项目中直接添加引用,应用netstandard2.0项目或者netstandard2.0编译后的dll均能正常工作。但如果通过xcopy等方式,额外将对应的dll复制到执行目录,会执行失败。调用方式一致,均为Assembly.Load(XXXDllName)。
错误信息为:System.IO.FileNotFoundException: 'Could not load file or assembly 'XXXDllName, Culture=neutral, PublicKeyToken=null'. 系统找不到指定的文件。'
《How can I dynamically load .NET core library with .NET framework dependencies?》这个提问跟我的情况基本相同。
分析
- 通过项目添加dll引用直接生成到执行目录。(正常运行)
- 通过编译完成后复制dll到执行目录。(失败)
经过比对,以上两种方式的生成目录基本一致,只有ProjectName.deps.json
这个文件有细微差别。差别主要就是是否有XXXDllName.dll
文件的依赖信息。如果用第一种方式生成的*.deps.json
文件,覆盖第二种方式的执行目录,是可以正常运行的。所以这里导致错误的原因就是*.deps.json
的内容。这与我之前在.net framework上的使用经验完全不一样。如果想想动态加载dll,这样看,在.NET6.0版本上好像不是很方便。
待更新。。。