在 ASP.NET vNext 中使用 Ninject 时出现编译器错误 CS0246(未找到类型或命名空间)

Posted

技术标签:

【中文标题】在 ASP.NET vNext 中使用 Ninject 时出现编译器错误 CS0246(未找到类型或命名空间)【英文标题】:Compiler error CS0246 (type or namespace not found) on using Ninject in ASP.NET vNext 【发布时间】:2014-10-01 23:46:19 【问题描述】:

我想在 Asp.Net vNext 类库中使用 Ninject。但我得到编译器错误 CS0246(“找不到类型或命名空间名称 'Ninject'”)。

这是我所做的:

1) 新建ASP.NET vNext Class Library

2) 编辑project.json:

         
    "dependencies": 
        "Ninject": "3.2.2.0"
    ,
    "configurations" : 
        "net451" :  
            "dependencies": 
            
        ,
        "k10" :  
            "dependencies": 
                "System.Runtime": "4.0.20.0"
            
        
    

3) 检查包管理器日志:

Restoring packages for C:\Projects\ClassLib1\project.json
Attempting to resolve dependency ClassLib1 >= 1.0.0
Attempting to resolve dependency Ninject >= 3.2.2.0
  GET https://www.nuget.org/api/v2/FindPackagesById()?Id='Ninject'
Attempting to resolve dependency mscorlib >= 
Attempting to resolve dependency System >= 
Attempting to resolve dependency System.Core >= 
Attempting to resolve dependency Microsoft.CSharp >= 
Attempting to resolve dependency ClassLib1 >= 1.0.0
Attempting to resolve dependency Ninject >= 3.2.2.0
Attempting to resolve dependency System.Runtime >= 4.0.20.0
  OK https://www.nuget.org/api/v2/FindPackagesById()?Id='Ninject' 1250ms
  GET https://www.nuget.org/api/v2/FindPackagesById?id='Ninject'&$skiptoken='Ninject','3.0.2-unstable-9057'
  OK https://www.nuget.org/api/v2/FindPackagesById?id='Ninject'&$skiptoken='Ninject','3.0.2-unstable-9057' 179ms
  GET https://www.nuget.org/api/v2/package/Ninject/3.2.2
  OK https://www.nuget.org/api/v2/package/Ninject/3.2.2 949ms
Resolving complete, 2531ms elapsed
Installing Ninject 3.2.2.0
Restore complete, 2755ms elapsed

看起来不错..

4) 编辑Class1.cs:

using Ninject;

namespace ClassLib1

    public class Class1
    
        public Class1()
        
            var kernel = new StandardKernel();
        
    

Intellisense 可以解析对 Ninject 的引用。

5) 构建并获得 CS0246:

1>------ Build started: Project: ClassLib1, Configuration: Debug Any CPU ------
1>  Building ClassLib1 .NETFramework,Version=v4.5.1
1>  Building ClassLib1 K,Version=v1.0
1>C:\Projects\ClassLib1\Class1.cs(1,7): error CS0246: The type or namespace name 'Ninject' could not be found (are you missing a using directive or an assembly reference?)
1>C:\Projects\ClassLib1\Class1.cs(9,30): error CS0246: The type or namespace name 'StandardKernel' could not be found (are you missing a using directive or an assembly reference?)
1>  
1>  Build failed.
1>      0 Warnings(s)
1>      2 Error(s)

怎么了?

【问题讨论】:

在此示例中:github.com/aspnet/DependencyInjection/tree/dev/src/…。他们在 project.json 中有一条奇怪的线 - “Microsoft.Framework.DependencyInjection”:“”,也许这就是 ninject 的问题? 没有。我用Microsoft.Framework.DependencyInjectionMicrosoft.Framework.DependencyInjection.Ninject 测试了它 - 得到了同样的错误。 【参考方案1】:

NInject 不适用于云优化 CLR(CoreCLR 或 K10)。此外,VS 2014 中存在一个已知问题,即无论您在项目属性中选择什么,它都会构建所有可用配置,在您的情况下为 net451 和 k10 - 这就是为什么您会看到这两行以及 K 下的错误:

1>  Building ClassLib1 .NETFramework,Version=v4.5.1
1>  Building ClassLib1 K,Version=v1.0

如果您需要 NInject 并且希望同时针对 Desktop CLR 和 Core CLR,请使用 #if K10#if NET45 条件编译块,就像我使用 here 一样。基本上你会为桌面 CLR 使用 NInject,为 Core CLR 使用开箱即用的 DI 容器。

如果您希望您的应用仅在 Desktop CLR 上运行,请从 project.json 中删除 K10 配置。

【讨论】:

对于其他阅读本文的人,您可能需要取消注释“aspnetcore50”目标框架。

以上是关于在 ASP.NET vNext 中使用 Ninject 时出现编译器错误 CS0246(未找到类型或命名空间)的主要内容,如果未能解决你的问题,请参考以下文章

如何更改 asp.net identity 3 (vnext) 使用的表名?

在 ASP.NET vNext 中,为啥没有即时重新编译代码?

ASP.NET 5 (vNext) 中的身份验证

ASP.NET vNext EF7 dbContext 问题

ASP.NET vnext 和打开数据库

在 asp.net 5/vnext 上的磁盘上没有 dll 的代码合同