.net core 在运行时i dotnetcore仍然需要仅常量程序集

.net core 在运行时i dotnetcore仍然需要仅常量程序集,.net-core,deployment,dependencies,.net Core,Deployment,Dependencies,我得到了一个只包含带有常量的静态类的程序集 public static class C { public const int Value = 123; } 我在不同的应用程序中使用这个程序集,它被标记为CopyLocal=false,并且没有部署 这适用于netframework应用程序,但对于netcoreapp我收到一条错误消息,说找不到程序集 编译代码中未引用程序集(使用ildasm验证),但.deps.json文件中仍有引用 我是否需要使用核心应用程序部署程序集,或者是否有将其

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

public static class C {
    public const int Value = 123;
}
我在不同的应用程序中使用这个程序集,它被标记为
CopyLocal=false
,并且没有部署

这适用于
netframework
应用程序,但对于
netcoreapp
我收到一条错误消息,说找不到程序集

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

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

(我的大多数netframework应用程序都只是小的可执行文件,因此似乎没有必要在部署中包含一个未使用的多兆字节程序集。核心应用程序从一开始就是大的多文件,所以这并不重要)

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

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

因此,常量被复制到核心构建中的输出。

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

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

接下来发生的事情如下:一旦在执行代码中的某个地方使用了缺少的程序集,运行时环境就会尝试加载它。对于.Net Framework,这是在一个非常特定的环境中发生的

这与dotnetcore不同。他们没有GAC,但有一种叫做

解决方案:


可能

这里的问题是程序集没有在执行代码的任何地方使用。程序集仅包含直接编译到代码中的常量<代码>事实上,当编译器在C#源代码[…]中遇到常量标识符时,它会将文本值直接替换到它生成的中间语言(IL)代码中。我试图通过创建两个程序集来重现您的情况,一个程序集(测试)带有一个公共常量,第二个程序集(使用者)引用第一个程序集,copylocal false,并使用常量。当我发布它时,deps.json中甚至没有提到test.dll(发布目录中也没有提到)。我把它移到运行dotnetcore的机器上,它就工作了。所以我不能重现你的问题。我使用的是dotnetcore 3.1。对不起,我出去了。您可以尝试打开.netcore 3.0提供的“readytorun”选项,它可以为您提前编译。谢谢。你的评论让我走上了正确的轨道,我发现了问题,请参阅我的更新
And ('%(MSBuildRuntimeType)' == '' Or '%(MSBuildRuntimeType)' == 'Full')