【问题标题】:c# The type is defined in an assembly that is not referencedc# 类型定义在未引用的程序集中
【发布时间】:2020-02-20 08:44:00
【问题描述】:

我正在使用 Microsoft.Owin 4.1 开发一个 .net MVC5 项目。 Owin 不能像 I think it supposed to 那样工作,所以我想我可以通过调试到 owin 源代码来解决这个问题。

步骤是:

克隆了aspnetkatana repo
将我的项目引用的3个包添加到我的解决方案中(右键单击解决方案>添加>现有项目)

  • Microsoft.Owin
  • Microsoft.Owin.Security
  • Microsoft.Owin.Security.Cookies

终于添加了对我项目的引用(右击我的项目>添加>引用)

当我尝试构建解决方案时,它会抛出如下错误:

类型“IOwinContext”在未引用的程序集中定义。您必须添加对程序集 'Microsoft.Owin, Version=3.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' 的引用。

VS 将app.CreatePerOwinContext 行标记为错误源。

    public partial class Startup {

        public void ConfigureAuth(IAppBuilder app) {
            app.CreatePerOwinContext(AppUserContext.Create);
            ...

另一个错误抱怨相同依赖项的版本 4.1.0.0(实际上是我拥有的版本,所以这个版本很混乱)

我的问题是为什么构建器不将 owin 源视为 v4.1.0.0 程序集,以及在这种情况下如何克服不同版本的需求。我的意思是我知道如果 NuGet 引用会发生这种情况,我可以使用bindingredirect,但不知道如何处理包含源的情况。当 NuGet 包含依赖项时,也没有必要引入 bindingredirect,这也会引起一些混乱。 (见下文)

旁注:在我开始尝试将这些项目作为源代码添加之前,它们被添加为 NuGet 包。没有引入bindingredirect,构建执行时没有任何错误或警告。 (这部分显然是在引入owin项目之前从csproj文件中删除的)

.csproj中的相关部分

    <Reference Include="Microsoft.Owin, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Owin.4.1.0\lib\net45\Microsoft.Owin.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Owin.Security, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Owin.Security.4.1.0\lib\net45\Microsoft.Owin.Security.dll</HintPath>
    </Reference>
    <Reference Include="Microsoft.Owin.Security.Cookies, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
      <HintPath>..\packages\Microsoft.Owin.Security.Cookies.4.1.0\lib\net45\Microsoft.Owin.Security.Cookies.dll</HintPath>
    </Reference>

编辑: 另外,我正在寻找的答案是如何告诉(如果可能的话)在当前解决方案中寻找临时依赖关系的构建器。澄清:在我的解决方案中,Microsoft.AspNet.Identity 已通过 NuGet 引入。这些包依赖于Microsoft.Owin 和子包。我可以告诉 builder 在这些包编译后Microsoft.AspNet.Identity 可以使用它们吗?

【问题讨论】:

  • 我经常在针对不同版本的 .NET Framework 时看到此错误。您正在引用 Owin 的 net45 版本。您的项目是否针对更高版本(例如 4.6)?
  • @RyanThomas 是的,你让我走上了正轨。在将所有项目设置为 .net framework 4.5 并经过大量 Update-Packate ... -如果最终编译后重新安装!请创建一个答案,我会将其标记为已接受的答案!谢谢!
  • @RyanThomas 呃抱歉,这是误报。构建成功,因为 update-package 安装了临时依赖项,因此它重新引入了 Microsoft.Owin 包。所有项目都设置为 .net framework 4.5,但我仍然收到相同的错误消息。
  • 如果您进入您的 web.config,它会显示正确的版本吗?如果没有,请删除配置中的引用并重建。另一种可能解决此问题的方法是转到您的库并从那里删除引用。
  • 我可以推荐从Nick Craver阅读Binding Redirects

标签: c# owin


【解决方案1】:

要调试依赖项,您无需将项目链接为参考。您可以在单独的解决方案中打开项目并构建调试程序集(DLL 和 PDB),然后如果您构建项目,您可以将调试二进制文件和源映射复制到构建输出文件夹中,然后在能够调试的同时进行调试也逐步浏览项目引用。

例如,假设我想调试 AutoMapper:

我的项目引用了 Automapper nuget 包:

我建立我的项目:

nuget 构建(发布)将被复制到输出:

然后将项目引用的发布版本替换为调试版本:

现在使用调试器启动项目,您应该也可以调试引用。 (VS 将覆盖每次构建时的 nuget 程序集,因此您必须每次都复制它们)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2016-10-01
    • 1970-01-01
    • 2011-08-16
    • 2014-08-15
    • 2016-05-01
    • 2018-01-10
    • 1970-01-01
    相关资源
    最近更新 更多