运行时i dotnetcore仍然需要仅常量程序集



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

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>

我刚刚添加了一个附加条件

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

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

免责声明如果引用不包含在GAC(全局程序集缓存(中,则通常应始终使用CopyLocal=True。

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

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

这与dotnetcore不同。他们没有GAC,但有一种叫做运行时包存储的东西

解决方案:

也许.NET Core有类似的GAC吗?

最新更新