在.net core使用vs2017直接引用dll编译通过,运行时提示找不到dll
在使用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和代码执行前反射加载,望各位大神支招。