【发布时间】:2016-01-11 23:21:00
【问题描述】:
我有很多必须以特定方式构建的 MVC Web 应用程序项目的复杂解决方案。这就是我使用自定义构建项目和msbuild 实用程序在我的本地计算机上构建解决方案的原因。问题是解决方案和其中的所有项目都在Visual Studio 中成功构建。但是当我尝试通过msbuild 使用AspNetCompiler 构建解决方案时,我不断收到同样的错误:
ASPNETCOMPILER:错误 ASPCONFIG:无法加载文件或程序集“Duke.Owin.VkontakteMiddleware,版本=1.2.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。参数不正确。 (来自 HRESULT 的异常:0x80070057 (E_INVALIDARG))
当我在Visual Studio (2013) 中构建解决方案时,不会出现此错误。试图解决这个问题我已经做了以下事情:
- 我的解决方案项目中的所有现有引用都配置为
Copy local = true - 在每次构建之前,我都会清除(并删除)我项目的所有
bin和obj文件夹。 - 我在每次构建之前多次清除了临时 Asp .Net 文件。
- 编译器表示找不到的所有程序集都位于包文件夹中。
-
尝试在每次构建之前恢复 NuGet 包:
- 已下载NuGet
- 通过添加
EnableNuGetPackageRestore=true环境变量启用 NuGet 包还原 - 在我的构建项目中添加了
<Exec Command='$(ToolsDirectory)\nuget restore "$(Solution)"'/>命令。
尝试在构建项目中手动定义引用:
<ItemGroup><Reference Include="Duke.Owin.VkontakteMiddleware"><HintPath>$(PackagesFolder)\Duke.Owin.VkontakteMiddleware.1.2.0.0\lib\net45\Duke.Owin.VkontakteMiddleware.dll</HintPath></Reference></ItemGroup>-
按照here 的建议,我手动编辑了无法构建的项目文件,并在编译器未找到的每个
李>Reference节点中添加了<Private>True</Private>。 尝试手动复制丢失的 dll:
<Copy SourceFiles="$(PackagesFolder)\Duke.Owin.VkontakteMiddleware.1.2.0.0\lib\net45\Duke.Owin.VkontakteMiddleware.dll" DestinationFolder="$(OutputDirectory)\bin" SkipUnchangedFiles="true" />
但是,经过以上所有,仍然没有运气。还有其他解决方案吗?
更新: 如果我将程序集添加到 GAC 它实际上会有所帮助,但是我的一些程序集是从 nuget 安装的包,并且它们没有强命名,因此我无法将它们全部添加到 GAC。当然,在 GAC 中注册所有程序集并不是一个理想的解决方案。
【问题讨论】:
-
这是一个常见的问题,人们正在使用位于其他地方的构建环境。底线是构建机器本身必须能够访问本地机器拥有的所有 DLLS。通常这意味着构建机器要么需要安装这些 dll,要么你必须将它们包含在你的程序集中。谁在引用这个? Duke.Owin.VkontakteMiddleware 以及它在您的本地计算机上的什么位置?
-
@JohnPeters,我正在本地机器上执行构建。我没有任何构建服务器。此 dll 位于我的解决方案的 packages 文件夹中,并被其中一个项目引用。
-
您是否尝试过在运行 msbuild 之前使用 NuGet 恢复解决方案包?
nuget restore MySolution.sln -
如果您仍然遇到此问题,您可以使用 Fusion Log 对其进行调试。仅仅因为系统上有一个 Dll,并不意味着加载程序可以找到它或其中的其他依赖程序集。
标签: c# asp.net .net msbuild aspnet-compiler