在.net core使用vs2017直接引用dll编译通过,运行时提示找不到dll

weixin_38056808 2017-07-13 06:45:20
在使用vs2017开发.net core应用时,通过项目引用的程序集可以正常编译和运行,但是通过直接引用dll的方式引用程序集时,编译可以通过,在运行时总是提示找不到程序集:
System.IO.FileNotFoundException:“Could not load file or assembly 'DirectReference, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'. 系统找不到指定的文件。”



看到这个问题后直观的认为是dll没有放到指定的路径,但是尝试过把dll丢到程序运行目录,system32,c:\windows\users\特定用户文件夹下,都不行。通过用dotnet 命令执行程序,开启procmon跟踪了下,发现运行的时候根本没有去加载这个dll,而通过项目引用的dll却能清楚的看到被加载的记录。
由此看来,感觉像是dll根本没有加载到运行时,导致了最终执行到对应代码时挂了。顺着这个思路,在程序启动后反射加载下dll,问题解决。代码中的TryLoadAssembly方法
class Program { static void Main(string[] args) { //尝试加载下程序集 //TryLoadAssembly(); DoSomeThing(); Console.ReadKey(); } private static void DoSomeThing() { //项目引用 ProjectReference.Class1.SayHello(); //直接引用 DirectReference.Class1.SayHello(); } private static void TryLoadAssembly() { Assembly entry = Assembly.GetEntryAssembly(); //找到当前执行文件所在路径 string dir = Path.GetDirectoryName(entry.Location); string entryName = entry.GetName().Name; //获取执行文件同一目录下的其他dll foreach (string dll in Directory.GetFiles(dir, "*.dll")) { if (entryName.Equals(Path.GetFileNameWithoutExtension(dll))) { continue; } //非程序集类型的关联load时会报错 try { AssemblyLoadContext.Default.LoadFromAssemblyPath(dll); } catch (Exception ex) { } } } }
但是这不是我想要的方式,因为这样随着引用的第三方dll的增多,需要维护一个清单来进行这个引用。

不知道是否存在一个什么在csproj文件中的配置,或者生成dll时的一个什么选项设置得不对,因为不管怎么着,允许我引用但是不让执行是让人无法理解的,毕竟是微软出品,应该不会有这么容易发现的问题。
在网上搜索到的解决方案是将这类dll打包成nuget的包,放在本地,然后还是通过加载包的方式来加载,微软官方指引中也是推荐的这种方式,但目前不想使用这种方式。
所以现在的问题是,有没有一种办法,让手工添加引用后的程序集可以编译通过并运行,不借助nuget和代码执行前反射加载,望各位大神支招。
...全文
44 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复

433

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧