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

  • 问题

  • 在使用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和代码执行前反射加载,望各位大神支招。

    2017年7月13日 6:45

答案

  • Hi,

    因为你的问题涉及.NET CORE的开发问题,我建议你去下面的论坛发帖。

    https://forums.asp.net/1255.aspx/1?ASP+NET+Core

    根据我的了解,微软是只提供这两种方式:

    1. 是通过add reference 这样的方式来管理。

    2. 是通过nuget来加载dll.

    对add reference这个操作,会在.csproj 文件里面会写入ProjectReference段。

    具体如下:

    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />
    

    你尝试手动添加一下,看有没有效果。

    我将会这个帖子移到一般讨论论坛。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 FridayPlay 2017年7月14日 7:21
    2017年7月14日 2:50
    版主

全部回复

  • Hi,

    因为你的问题涉及.NET CORE的开发问题,我建议你去下面的论坛发帖。

    https://forums.asp.net/1255.aspx/1?ASP+NET+Core

    根据我的了解,微软是只提供这两种方式:

    1. 是通过add reference 这样的方式来管理。

    2. 是通过nuget来加载dll.

    对add reference这个操作,会在.csproj 文件里面会写入ProjectReference段。

    具体如下:

    <ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj" />
    

    你尝试手动添加一下,看有没有效果。

    我将会这个帖子移到一般讨论论坛。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 FridayPlay 2017年7月14日 7:21
    2017年7月14日 2:50
    版主
  • 其它社区的热心伙伴帮我解决了这个问题,使用2017 preview 15.3.0 Preview 3.0生成的dll就没有这个问题,而我目前用的vs版本是15.2(26430.14)
    2017年7月14日 7:25