“找不到包"enc.dll"的编译库位置. .net核心依赖项注入发生错误 [英] "Cannot find compilation library location for package "enc.dll"" error occur .net core dependency injection

查看:111
本文介绍了“找不到包"enc.dll"的编译库位置. .net核心依赖项注入发生错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用asp.net核心mvc构建一个网站,并为登录添加了enc.dll文件的依赖关系,该文件只是对用户信息进行加密/解密. 我使用enc.dll文件制作了Seeder类,该文件具有密钥属性,并使用密钥进行加密/解密.然后,将其添加到服务中以使用依赖项注入功能.

I am building a website using asp.net core mvc, and for the login i added dependency for enc.dll file, which just encrypt/decrypt user information. I made a Seeder class with enc.dll file, which has a key property and en/decrypt with the key. Then I added it to my service to use dependency injection feature.

services.AddSingleton<ISeeder, Seeder>();

虽然当我调用种子程序类的enc,dec函数时效果很好,但它不返回任何错误.下面是示例代码.

While it works well when i call enc, dec function of seeder class, it does not return any error. Below is the example code.

    private readonly ISeeder seed;
    public AccountController(ISeeder seed)
    {
        this.seed = seed;
    }

    [HttpGet]
    public IActionResult test()
    {
        string s = seed.Enc("testEncode");
        return Json(s);
    }

因此,当我返回由种子实例创建的字符串s时,它可以工作.

So it works when i return string s that is created by seed instance.

但是当我尝试不使用种子实例并抛出错误而返回视图时,它不起作用,其中Enc是我正在使用的dll库.

but it is not working when i try to return a view without using seed instance and throwing an error, where Enc is the dll library i am using.

InvalidOperationException: Cannot find compilation library location for package 'Enc'
Microsoft.Extensions.DependencyModel.CompilationLibrary.ResolveReferencePaths(ICompilationAssemblyResolver resolver, List<string> assemblies)

下面是我的Seeder代码.

And below is my Seeder code.

 private Enc enc;
    private readonly EncKey key;
    public Seeder(IOptions<EncKey> options)
    {
        enc = new Enc();
        key = options.Value;
    }

    public string Dec(string toDec)
    {
        return enc.Dec(toDec, key.EncryptKey);
    }

    public string Enc(string toEnc)
    {
        return enc.Enc(toEnc, key.EncryptKey);
    }

有人可以帮忙吗?我正在.net core 2.0环境中工作

Could anyone help? I am working on .net core 2.0 environment

推荐答案

更新

此问题已在2.0.3中修复,适用于更新VS(或手动更新)的问题 dotnet SDK和Runtime)以及通过nuget(特别是)的项目包 Microsoft.AspNetCore.All到2.0.3)

This issue was fixed in 2.0.3, for apply need to update VS(or manualy dotnet SDK and Runtime) and project packages via nuget(in particular Microsoft.AspNetCore.All to 2.0.3)

.Net Core 2.0的已知问题 https://github.com/dotnet/core-setup/issues/2981

It's known issue of .Net Core 2.0 https://github.com/dotnet/core-setup/issues/2981

Razor视图预编译无法解析lib路径

Razor view precompilation can not resolve lib path

这里有解决方法来完成这项工作:

Here workaround to get this work:

添加此内容(这是修复版本发布错误)

add this (it's fixing release publish error)

using Microsoft.AspNetCore.Mvc;
using Microsoft.DotNet.PlatformAbstractions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyModel;
using Microsoft.Extensions.DependencyModel.Resolution;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;

namespace somenamespace
{
    public class MvcConfiguration : IDesignTimeMvcBuilderConfiguration
    {
        private class DirectReferenceAssemblyResolver : ICompilationAssemblyResolver
        {
            public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
            {
                if (!string.Equals(library.Type, "reference", StringComparison.OrdinalIgnoreCase))
                {
                    return false;
                }

                var paths = new List<string>();

                foreach (var assembly in library.Assemblies)
                {
                    var path = Path.Combine(ApplicationEnvironment.ApplicationBasePath, assembly);

                    if (!File.Exists(path))
                    {
                        return false;
                    }

                    paths.Add(path);
                }

                assemblies.AddRange(paths);

                return true;
            }
        }

        public void ConfigureMvc(IMvcBuilder builder)
        {
            // .NET Core SDK v1 does not pick up reference assemblies so
            // they have to be added for Razor manually. Resolved for
            // SDK v2 by https://github.com/dotnet/sdk/pull/876 OR SO WE THOUGHT
            /*builder.AddRazorOptions(razor =>
            {
                razor.AdditionalCompilationReferences.Add(
                    MetadataReference.CreateFromFile(
                        typeof(PdfHttpHandler).Assembly.Location));
            });*/

            // .NET Core SDK v2 does not resolve reference assemblies' paths
            // at all, so we have to hack around with reflection
            typeof(CompilationLibrary)
                .GetTypeInfo()
                .GetDeclaredField("<DefaultResolver>k__BackingField")
                .SetValue(null, new CompositeCompilationAssemblyResolver(new ICompilationAssemblyResolver[]
                {
                    new DirectReferenceAssemblyResolver(),
                    new AppBaseCompilationAssemblyResolver(),
                    new ReferenceAssemblyPathResolver(),
                    new PackageCompilationAssemblyResolver(),
                }));
        }
    }
}

和这个(正在修复编译错误)

and this (it's fixing compilation errors)

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection.PortableExecutable;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
using Microsoft.CodeAnalysis;
using Microsoft.Extensions.DependencyModel;
using Microsoft.AspNetCore.Mvc.Razor.Compilation;

namespace somenamespace
{
    public class ReferencesMetadataReferenceFeatureProvider : IApplicationFeatureProvider<MetadataReferenceFeature>
    {
        public void PopulateFeature(IEnumerable<ApplicationPart> parts, MetadataReferenceFeature feature)
        {
            var libraryPaths = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
            foreach (var assemblyPart in parts.OfType<AssemblyPart>())
            {
                var dependencyContext = DependencyContext.Load(assemblyPart.Assembly);
                if (dependencyContext != null)
                {
                    foreach (var library in dependencyContext.CompileLibraries)
                    {
                        if (string.Equals("reference", library.Type, StringComparison.OrdinalIgnoreCase))
                        {
                            foreach (var libraryAssembly in library.Assemblies)
                            {
                                libraryPaths.Add(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, libraryAssembly));
                            }
                        }
                        else
                        {
                            foreach (var path in library.ResolveReferencePaths())
                            {
                                libraryPaths.Add(path);
                            }
                        }
                    }
                }
                else
                {
                    libraryPaths.Add(assemblyPart.Assembly.Location);
                }
            }

            foreach (var path in libraryPaths)
            {
                feature.MetadataReferences.Add(CreateMetadataReference(path));
            }
        }

        private static MetadataReference CreateMetadataReference(string path)
        {
            using (var stream = File.OpenRead(path))
            {
                var moduleMetadata = ModuleMetadata.CreateFromStream(stream, PEStreamOptions.PrefetchMetadata);
                var assemblyMetadata = AssemblyMetadata.Create(moduleMetadata);

                return assemblyMetadata.GetReference(filePath: path);
            }
        }
    }
}

也将addMVC更改为此

also change addMVC to this

//workaround https://github.com/dotnet/core-setup/issues/2981 will be fixed in 2.0.1
            services.AddMvc().ConfigureApplicationPartManager(manager =>
            {
                var oldMetadataReferenceFeatureProvider = manager.FeatureProviders.First(f => f is MetadataReferenceFeatureProvider);
                manager.FeatureProviders.Remove(oldMetadataReferenceFeatureProvider);
                manager.FeatureProviders.Add(new ReferencesMetadataReferenceFeatureProvider());
            });

您将能够在自己的视图中使用dll

and you will able to use dll in your view

您还有第二种方法是在此处禁用剃须刀预编译示例 从ASP.Net Core 2 API中删除PrecompiledViews.dll

also you have second way is disable razor precompilation here example Deleting PrecompiledViews.dll from ASP.Net Core 2 API

这篇关于“找不到包"enc.dll"的编译库位置. .net核心依赖项注入发生错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆