【问题标题】:Unable to add native .dll reference to source generator project无法将本机 .dll 引用添加到源生成器项目
【发布时间】:2021-09-26 03:33:15
【问题描述】:

您可以在https://github.com/myblindy/GrimBuilding/tree/efcoreefcore 分支)找到完整的源代码。

我了解源生成器无法自动从 nuget 包中获取依赖项,您必须使用笨拙的解决方法才能使其工作,我已经这样做了。这是我的源代码生成器项目:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <LangVersion>preview</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp" Version="4.0.0-1.final" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.2" PrivateAssets="all" />
    <PackageReference Include="SQLitePCLRaw.bundle_e_sqlite3" Version="2.*-*" GeneratePathProperty="true" PrivateAssets="all" />
    <PackageReference Include="Microsoft.Data.Sqlite.Core" Version="6.*-*" GeneratePathProperty="true" PrivateAssets="all" />
    <PackageReference Include="SQLitePCLRaw.lib.e_sqlite3" Version="2.*-*" GeneratePathProperty="true" PrivateAssets="all" />
    <PackageReference Include="SQLitePCLRaw.provider.e_sqlite3" Version="2.*-*" GeneratePathProperty="true" PrivateAssets="all" />
  </ItemGroup>

  <PropertyGroup>
    <GetTargetPathDependsOn>$(GetTargetPathDependsOn);GetDependencyTargetPaths</GetTargetPathDependsOn>
  </PropertyGroup>

  <Target Name="GetDependencyTargetPaths">
    <ItemGroup>
      <TargetPathWithTargetPlatformMoniker Include="$(PKGSQLitePCLRaw_bundle_e_sqlite3)\lib\netstandard2.0\SQLitePCLRaw.batteries_v2.dll" IncludeRuntimeDependency="false" />
      <TargetPathWithTargetPlatformMoniker Include="$(PKGSQLitePCLRaw_provider_e_sqlite3)\lib\netstandard2.0\SQLitePCLRaw.provider.e_sqlite3.dll" IncludeRuntimeDependency="false" />
      <TargetPathWithTargetPlatformMoniker Include="$(PKGSQLitePCLRaw_lib_e_sqlite3)\runtimes\win-x64\native\e_sqlite3.dll" IncludeRuntimeDependency="false" />
      <TargetPathWithTargetPlatformMoniker Include="$(PKGMicrosoft_Data_Sqlite_Core)\lib\netstandard2.0\Microsoft.Data.Sqlite.dll" IncludeRuntimeDependency="false" />
    </ItemGroup>
  </Target>
</Project>

由于也没有任何传递支持,我一个一个添加了每个嵌套的Microsoft.Data.Sqlite 包,生成它们的路径属性并使用TargetPathWithTargetPlatformMoniker 引用它。直到我到达本机e_sqlite3.dll,这一切都有效,如果我使用TargetPathWithTargetPlatformMoniker,它会尝试将其作为托管库引用,但它会按预期失败:

4>CSC : warning CS8034: Unable to load Analyzer assembly C:\Users\meep\.nuget\packages\sqlitepclraw.lib.e_sqlite3\2.0.5-pre20210521085756\runtimes\win-x64\native\e_sqlite3.dll : PE image doesn't contain managed metadata.

既然找到了路径,我可以使用不同的标签来让主项目复制e_sqlite3.dll 文件以便分析器可以使用它吗?

【问题讨论】:

    标签: c# code-generation roslyn-code-analysis


    【解决方案1】:

    取自.NET project SDK overview

    构建事件

    在 SDK 样式的项目中,使用名为 PreBuild 或 PostBuild 的 MSBuild 目标,并为 PreBuild 设置 BeforeTargets 属性或为 PostBuild 设置 AfterTargets 属性。

     <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
        <Exec Command="&quot;$(ProjectDir)PreBuildEvent.bat&quot; &quot;$(ProjectDir)..\&quot; &quot;$(ProjectDir)&quot; &quot;$(TargetDir)&quot;" />
    </Target>
    
    <Target Name="PostBuild" AfterTargets="PostBuildEvent">
       <Exec Command="echo Output written to $(TargetDir)" />
    </Target>
    

    也许您可以使用这些指令之一手动移动文件?

    还有这个:

    <Content Include="$(OutputPath)\*.dll;$(OutputPath)\*.json">
          <Pack>true</Pack>
          <PackagePath>build\</PackagePath>
    </Content>
    

    你能这样移动文件吗?

    【讨论】:

    • 不幸的是,尽管您可以使用后一种方法将本机二进制文件移动到输出目录,但代码中的实际引用并未重定向,它们仍会尝试从某些不存在的路径访问 dll。我认为 TargetPathWithTargetPlatformMoniker 有一些魔力,它重新绑定了所有仅使用 ContentNone 无法完成的引用:(
    猜你喜欢
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2012-08-25
    相关资源
    最近更新 更多