为什么.NET不在任何二进制文件的输出路径中查找?

时间:2017-05-24 14:51:06

标签: c# .net asp.net-mvc visual-studio-2015

我继承了Visual Studio Web项目,输出路径指定为Could not load file or assembly 'System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified. 。当我构建时,所有文件(包括已编译的项目文件以及软件包,如MVC)都显示在那里。但是,当我点击F5运行应用程序时,我得到以下异常:

bin

例外情况继续列出系统正在寻找那些(和其他)文件的位置。它看起来的第一个地方是bin,这是正常的输出文件夹。为什么.NET不在指定的输出文件夹中查找,我怎样才能看到它?

澄清:为了清楚起见,此异常并非MVC独有。如果我手动创建bin文件夹并在那里复制MVC DLL,那么我将通过此异常,但是为它寻找的下一个文件获取另一个。如果我将所有文件复制到bin,那么应用程序运行正常。运行时只是在文件的指定输出文件夹中查找。

更新:如果我将输出路径更改为bin,则在那里输出NO文件。我没有定义构建后事件。

更新:这是我的构建设置。我构建项目时甚至没有创建bin文件夹(我正在尝试使用@app.route('/authorize/<provider>') def oauth_authorize(provider): if not g.user.is_anonymous: return redirect(url_for('index')) if provider == 'facebook': return facebook_auth.authorize(callback=url_for('facebook_authorized', next=request.args.get('next') or request.referrer or None, _external=True)) 进行测试),更不用说将文件复制到其中了。当我点击F5时,Debug肯定是选定的构建类型。

enter image description here

更新:以下是解决方案配置设置: enter image description here

2 个答案:

答案 0 :(得分:1)

  

无法加载文件或程序集“System.Web.Mvc,Version = 5.2.3.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35”或其中一个依赖项 。系统找不到指定的文件。

错误是编译错误。这意味着在启动MVC运行时之前,构建正在崩溃

这很容易证明。删除bin文件夹并尝试再次编译。如果没有重新创建和/或缺少大量文件,则意味着构建并未完全实现。

可能导致这种情况的一些事情是:

  1. 解决方案中两个不同.csproj文件之间的MVC(和/或MVC依赖项)版本号不匹配。
  2. 您的.csproj文件与web.config和/或/Views/web.config之间的MVC(和/或MVC相关性)版本号不匹配。
  3. 对于MVC(和/或MVC依赖项)DLL引用位置,一个或多个.csproj文件具有无效<HintPath>
  4. NuGet package restore根本没有设置或设置不正确。检查此问题的简便方法是查看packages/文件夹,查看错误消息中的引用是否存在于磁盘上。
  5. 解决此问题的最佳(最安全)方法是go through these files manually。在升级依赖项版本或更改文件位置时,Visual Studio并不总是做出正确的决定。

    .csproj文件中的典型MVC 5引用和版本应该如下所示(您可能需要相应地调整net45x中的版本号和<HintPath>版本):

    <Reference Include="System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Mvc.5.0.0\lib\net45\System.Web.Mvc.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.Razor.3.0.0\lib\net45\System.Web.Razor.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.dll</HintPath>
    </Reference>
    <Reference Include="System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <Private>True</Private>
      <HintPath>..\packages\Microsoft.AspNet.WebPages.3.0.0\lib\net45\System.Web.WebPages.Razor.dll</HintPath>
    </Reference>
    

    更新

    我看到你发布了Visual Studio的项目属性。配置是高度自定义的,我不建议您使用Visual Studio的项目属性设计器来编辑它,因为它可能导致配置损坏。

    我的建议是使用以下过程来审核您的.csproj文件引用。这比删除引用和重新添加引用要安全得多,因为Visual Studio不支持编辑.csproj文件中可能存在的所有内容的方法。

    1. 在解决方案资源管理器中右键单击项目节点,然后单击“卸载项目”。
    2. 再次右键单击项目节点,然后单击编辑.csproj。
    3. 在文件中搜索对上述每个程序集的引用,并相应地更新版本和HintPath。确保您使用的HintPath实际指向磁盘上的现有文件。
    4. 对解决方案中的所有相关项目(以及不属于解决方案的DLL中的任何项目)重复这些步骤。
    5. 您还应该在web.configViews/web.config中查看程序集版本(尤其是MVC的版本),并在必要时进行更新。有关更多详细信息,请参阅link

答案 1 :(得分:0)

更新应用程序web.config文件

请务必在应用web.config文件中进行这些更改,而不是在Views文件夹中进行web.config文件。

<runtime>
   <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
           <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
           <bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
        </dependentAssembly>
   </assemblyBinding>
</runtime>