【问题标题】:Constant only assembly still required at runtime i dotnetcore在 dotnet 核心中运行时仍需要仅常量程序集
【发布时间】:2020-06-25 15:02:15
【问题描述】:

我得到了一个只包含带有常量的静态类的程序集

public static class C {
    public const int Value = 123;
}

我在不同的应用程序中使用这个程序集,它标有CopyLocal = false,并且没有部署。

这项工作适用于 netframework 应用程序,但适用于 netcoreapp 我收到一条错误消息,提示找不到程序集。

编译后的代码中没有引用程序集(使用ildasm 验证),但.deps.json 文件中仍有引用。

我是否需要使用核心应用程序部署程序集,或者是否有将其从 .deps.json 文件中排除的设置?

(我的大多数网络框架应用程序都只是小型可执行文件,因此似乎没有必要在部署中包含数兆字节的未使用程序集。核心应用程序从一开始就很大且多文件,所以没关系)

编辑:发现问题。 该程序集实际上没有CopyLocal = false。它使用 .targets 文件在构建时将其删除

<Target Name="PreventConstantsCopyLocal" AfterTargets="ResolveReferences">
    <ItemGroup>
        <ReferenceCopyLocalPaths Remove="@(ReferenceCopyLocalPaths)" 
                                 Condition="'%(ReferenceCopyLocalPaths.NuGetPackageId)' == 'MyConstants'" />
    </ItemGroup>
</Target>

我只是添加了一个额外的条件

And ('%(MSBuildRuntimeType)' == '' Or '%(MSBuildRuntimeType)' == 'Full')

所以常量被复制到核心构建中的输出。

【问题讨论】:

    标签: .net-core deployment dependencies


    【解决方案1】:

    免责声明 作为一般规则,如果引用未包含在 GAC(全局程序集缓存)中,则应始终使用 CopyLocal=True。

    问题: 当您使用程序集时,设置了CopyLocal = false,这意味着程序集(.dll 文件)不会被放置到您刚刚构建的任何内容的输出目录中。

    接下来会发生以下情况:只要在执行代码的某处使用了缺失的程序集,运行时环境就会尝试加载它。对于 .Net Framework,这发生在一个非常具体的 way 中。

    这与 dotnetcore 不同。他们没有 GAC,但有一个叫做 Runtime package Store

    解决方案:

    也许Is there any GAC equivalent for .NET Core?

    【讨论】:

    • 这里的问题是程序集在执行代码的任何地方都没有使用。程序集只包含直接编译到代码中的常量。 In fact, when the compiler encounters a constant identifier in C# source code [...] it substitutes the literal value directly into the intermediate language (IL) code that it produces.docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
    • 我试图通过创建两个程序集来重现您的情况,一个程序集(测试)具有一个公共常量,第二个程序集(消费者)引用第一个程序集,copylocal false,并使用常量。当我发布它时,在 deps.json 中甚至没有提到 test.dll (而不是在发布目录中)。我把它移到了一台运行 dotnetcore 的机器上,它工作了。所以我无法重现您的问题。我使用的是 dotnetcore 3.1。对不起,我出去了。您也许可以尝试打开“readytorun”选项,该选项可从 .netcore 3.0 获得,它会提前为您编译?
    • 谢谢。您的评论让我走上了正轨,我发现了问题,请参阅我的更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2018-07-17
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    相关资源
    最近更新 更多