【问题标题】:Dependency finder for a DLL in an application应用程序中 DLL 的依赖项查找器
【发布时间】:2015-06-11 03:59:30
【问题描述】:

我有一个应用程序,我正尝试使用 MSBuild 通过命令行构建。我的应用程序由许多相互依赖的项目组成。我的问题是,是否有办法找到依赖于特定 DLL 的 DLL。此要求是由于以下问题造成的。

假设我的应用程序中有一个项目 BaseProject,它托管一个 Enum.cs 类,用于存储系统范围内使用的所有枚举。还有另一个名为 DependendentProject 的项目,它有一个 DependendentOnEnum.cs 类,它使用 Enum.cs 中的枚举之一。

举例

Enum.cs 有以下枚举

public enum ClassTypeEnum
        {           
            A, 
            DC, 
            MP,
            FX,
            CA,
            CD
        }

而DependendentOnEnum使用这个枚举根据枚举类型来验证和处理数据

void ValidateAndProcessData(int enumValue)
{
       if(enumValue == ClassTypeEnum.FX) //Line3
       {
              //ProcessData
       }
}

现在当 BaseProject 和 DependentProject 的 DLL。上面sn-p中的“ClassTypeEnum.FX”改为3。

如果现在有其他用户出现并将“ClassTypeEnum”更改为类似的内容,那么问题就出现了

public enum ClassTypeEnum
            {           
                A, 
                DC, 
                MP,
                OI, //Added OI at position 3
                FX,
                CA,
                CD
            }

现在我们的补丁构建器在生产机器上所做的是它为已更改的项目构建所有 dll。现在因为这里只有 BaseProject 改变了,只有它的 DLL 被构建。

因此,DependendentProject 的 DLL 现在开始指向 ClassTypeEnum.OI 而不是 ClassTypeEnum.FX。并且整个验证过程都失败了。

我尝试过使用depends.exe,但它只涵盖系统依赖项。我还想要所有那些依赖于 特定 DLL 的 DLL,它不提供。

我知道再次构建整个解决方案是一种解决方案,但这将是一种矫枉过正,因为并非所有项目都定期修改。

那么有没有办法建立这样的依赖结构呢?构建结构的任何工具或一些代码sn-p。

【问题讨论】:

  • 为什么不明确地为枚举值分配数值?
  • 嗨coffeeMuncher,上述问题是依赖dll引起的众多问题之一,我想要一个更通用和具体的解决方案。
  • 根据版本加载DLL怎么样?

标签: c# dll enums msbuild dependencies


【解决方案1】:

Visual Studio 项目文件 (.csproj) 只是 XML 文件。然后,在您的补丁构建器中,您可以读取 XML 文件以读取依赖的 DLL 或项目,如果它引用了修改后的库(在本例中为 BaseProject),则构建项目。在ItemGroup下可以找到依赖的DLL,如下图

<ItemGroup>
<ProjectReference Include="..\ClassLibrary1\ClassLibrary1.csproj">
  <Project>{323f9761-89f4-4405-b8b1-d6feb5b1ec89}</Project>
  <Name>ClassLibrary1</Name>
</ProjectReference>

以上内容摘自 .csproj 文件。

【讨论】:

    【解决方案2】:

    您一直提到 DLL 而不是 ClassLibrary csprojs,所以我一直在考虑 DLL,从而产生了这种不同的观点:

    ildasm /TEXT /HEADER ^
        "c:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.Activities.Build\v4.0_4.0.0.0__31bf3856ad364e35\Microsoft.Activities.Build.dll" ^
    | grep -A 4 ".assembly extern "
    

    替换您的 DLL 的路径。 (插入符号只是 command.exe 的转义字符。)

    这会产生如下参考数据:

    .assembly extern System.ServiceModel.Internals
    {
      .publickeytoken = (31 BF 38 56 AD 36 4E 35 )
      .ver 4:0:0:0
    }
    

    (您可以通过GOW 获得grep。您可以通过Chocolatey 获得get GOW。您可以通过PowerShell 获得get Chocolatey。说到PowerShell,您当然可以在没有grep 的情况下使用它来执行此操作——只是grep -A n 非常方便.)

    【讨论】:

      猜你喜欢
      • 2016-11-10
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多