应用程序中DLL的依赖项查找器

时间:2015-04-06 17:51:21

标签: c# dll enums msbuild dependencies

我有一个应用程序,我试图通过命令行与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时。上述代码段中的“ClassTypeEnum.FX”更改为3。

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

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

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

由于这个原因,DependendentProject的DLL现在开始进入 ClassTypeEnum.OI 而不是 ClassTypeEnum.FX 。整个验证过程失败。

我尝试过使用depends.exe,但它只涵盖系统依赖项。此外,我希望所有那些依赖于特定 DLL的DLL,它没有提供。

我知道再次构建整个解决方案是一个答案,但由于并非所有项目都经常被修改,因此这将是一种过度杀伤。

那么有没有办法构建这样的依赖结构?任何构建结构的工具或代码片段。

2 个答案:

答案 0 :(得分:0)

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文件的摘录。

答案 1 :(得分:0)

你继续引用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-just { {1}}非常方便。)