首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NuGet在app.config包更新期间将assemblyBinding添加到库项目中?

为什么NuGet在app.config包更新期间将assemblyBinding添加到库项目中?
EN

Stack Overflow用户
提问于 2014-03-06 14:41:08
回答 3查看 21.1K关注 0票数 59

这些信息不是只有在可执行文件的项目中才有必要吗?

如何禁用此文件创建?

NuGet 2.8

编辑

库项目是NuGet 2.7中的例外,通过修复此问题:http://nuget.codeplex.com/workitem/3827和commit:https://github.com/NuGet/NuGet2/commit/448652d028e3f01ba4022e147baaf4e1fb3f969b在2.8中更改了行为

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-06 15:24:27

程序集绑定重定向在类库中和在可执行项目中一样有效。

考虑一下这一点;在构建应用程序时,编译器如何知道要使用哪个版本的引用程序集(用于类库)?

通常情况下,这将是很好的工作,没有重定向,但当你绊倒的机器,有一个GAC‘’ed版本的程序集,你可能会陷入麻烦。

我建议你阅读程序集绑定重定向文档以更好地理解它是什么和它在做什么。

NuGet添加了重定向的app.config来帮助您,坦白地说,我并不能像预期的那样获得额外的app.config。

从今天起,它将向所有项目添加重定向,但下列类型除外:

  • WiX
  • JS
  • 内梅勒
  • C++
  • 协同效应
  • Visual Studio
  • Windows商店应用程序

据我所知,没有办法把这关了。如果这是个问题,你可以在Github制造一个问题

添加程序集绑定重定向的源代码可以找到这里

票数 9
EN

Stack Overflow用户

发布于 2019-07-23 21:41:31

NuGet包管理器将程序集绑定重定向到库项目的原因是,有些项目类型的输出类型是库,但是有一些特殊的机制可以确保库的应用程序或web配置文件在运行时得到应用。这与您可能熟悉的更典型的库用法相反,在这种情况下,库的配置文件根本不被使用。

例如,Azure SDK 1.8+中的Azure Web和Worker角色项目将生成库,但是当它们被IIS包装在exe中时,库的配置文件将被设置为该exe的默认设置。这样,您就可以获得所有应用程序配置,而不必显式发布与包装可执行文件这是过去的做法同名的特殊配置文件。现在,构建过程输出重命名的配置文件(例如app.config -> myWebRoleLibrary.dll.config),一切都按其应有的方式工作。

XUnit也做了类似的事情;加载测试程序集的app.config,而不是测试运行进程的app配置。

值得一提的是,您也可以使用在任何项目中手动加载配置文件、库或否。您必须确保配置文件位于正确的位置,但这是可能的。但是,这不太适用于绑定重定向,因为通常这些重定向仅由CLR中的程序集加载程序使用。我想你可以把AssemblyLoad挂起来,但是现在我们已经很好地重新发明了方向盘。

所以,答案是“在我的图书馆项目中有这个必要吗?”也许是。如果您的库项目不是web或工作人员角色或测试项目,并且不手动加载配置文件,那么app.config可能是良性的,但没有必要。

至于禁用它,您只能在Visual级别执行。您可以在VS2019中找到以下选项: Tools -> Options.-> NuGet包管理器-> General -> Skip应用绑定重定向。

什么使用我的配置文件?

编译器(csc.exe)

编译器使用正在构建的程序集的配置文件有一个原因:元素

上面的链接提供了一个罕见的场景,您将需要编译器选项,但绝大多数用户不会。可以这么说,如果您不知道是否正在使用该功能,您就不会使用该功能。

它不解析配置文件的任何其他元素,包括程序集绑定重定向,这些都是NuGet添加的元素。

生成引擎(msbuild)

MSBuild使用了应用程序的一些步骤,但重要的是找不到主要的依赖项,它将以/reference:选项的形式传递给csc.exe。

为了找到主引用,MSBuild (特别是ResolveAssemblyReference任务)将搜索公共目标文件中枚举的路径集合。如果无法在csproj中找到显式依赖项,它将发出警告,如果编译需要依赖项,则可能会进一步发出错误。

之后,它将搜索传递依赖项。它不会将这些文件传递给编译器,而是使用它们生成一个文件列表,在随后的构建步骤中,这些文件需要考虑生成许可证文件、信任信息和建议的绑定重定向。这个步骤确实考虑了项目的配置文件,并特别使用它的绑定重定向来通知传递依赖项列表。需要注意的是,构建一个exe将使而不是在构建过程中考虑其库的app.config文件,而库的app.config不会改变该库的dll生成方式。

运行时(CLR)

CLR使用配置文件更改其定位程序集的方式

IIS

IIS将读取web.config文件的元素,以改变web应用程序的行为方式。例如,缓存特性

应用程序

应用程序可以使用ConfigurationManager手动从配置文件中检索配置数据。

票数 20
EN

Stack Overflow用户

发布于 2015-07-07 19:30:25

我创建了一个小型控制台应用程序,它检查app.config文件的所有日期,然后自动从.csproj和文件中删除它们。Todo:从tfs删除。也许这能帮上忙。

代码语言:javascript
复制
class Program
{
    private static string RootFolder;
    private static string AppConfigName;
    private static bool AskConfirmation = true;
    static void Main(string[] args)
    {
        try
        {
            AppConfigName = "app.config";
            RootFolder = @"<Your project path>";
            ScanDir(RootFolder);
            Console.WriteLine();
            Console.WriteLine("DONE!");
            Console.WriteLine("Press ENTER to finish...");
            Console.ReadLine();

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }

    private static void ScanDir(string directoryParent)
    {
        var dirs = Directory.GetDirectories(directoryParent);
        foreach (var dir in dirs)
        {
            var dirInfo = new DirectoryInfo(dir);
            if (dirInfo.Name == "bin" || dirInfo.Name == "obj" || dirInfo.Name == "debug" || dirInfo.Name == "tempPE" || dirInfo.Name == "java" || dirInfo.Name == "res") continue;
            var files = Directory.GetFiles(dir, "app.config");
            if (files.Length == 0)
            {
                ScanDir(dir);
                continue;
            }
            Process(dir);
            //ScanDir(dir);
        }
    }

    private static void Process(string dir)
    {
        var fi = new FileInfo(Path.Combine(dir, AppConfigName));
        if (fi.CreationTime.Date != DateTime.Now.Date) return;
        if (AskConfirmation)
        {
            Console.WriteLine("Scan " + dir.Replace(RootFolder, ""));
            Console.Write("Remove (y)es or (n)o ?");
            var key = Console.ReadKey();
            Console.WriteLine();
            if (key.Key.ToString() =="Y")
                // remove app.config
                RemoveAppConfig(dir, fi);
        }
        else
            RemoveAppConfig(dir, fi);
    }

    private static void RemoveAppConfig(string dir, FileInfo fi)
    {
        var csProjs = Directory.GetFiles(dir, "*.csproj");
        foreach (var csProj in csProjs)
        {
            var txt = File.ReadAllText(csProj);
            txt = Regex.Replace(txt,"<None Include=\"App.Config\" />", "",RegexOptions.IgnoreCase);
            File.Delete(csProj);
            File.WriteAllText(csProj, txt);
        }
        File.Delete(fi.FullName);
        // todo: undo in tfs
        Console.WriteLine("Deleted");
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22227675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档