为什么要加载此 DLL DevExpress.ExpressApp?

Why is this DLL DevExpress.ExpressApp loading?

我正在尝试为客户部署插件。 我们使用 MEF,导入,导出属性。我使用导出,客户导入它 我的应用程序使用 DevExpress XtraGrid、XtraEditors 和许多其他 DevExpress DLL(见屏幕截图),System.Data.Services。 尽管提供了所有这些必需的 DLL 及其许多依赖项,该插件似乎仍然需要 DevExpress.ExpressApp。 DevExpress.ExpressApp 及其所有其他依赖项绝对不需要。

由于客户一直抱怨他们有一个FileNotFound异常,我决定做一个测试项目来导入我自己的插件。这是我的测试代码,用于测试他得到的客户理论如下。

System.IO.FileNotFoundException: Could not load file or assembly 'DevExpress.ExpressApp.v14.2, Version=14.2.7.0, 


Our Plugin
     [Export(typeof (ISomething))]
        public class MyClass : ISomething
        {

    }
TESTER
     class Program
    {
           [ImportMany]
        public IEnumerable<ISomething> Somethings { get; set; }
        static void Main(string[] args)
        {

            var rp = new Program();
            rp.Run();


        }
        public void Run()
        {
            Compose();

        }
        public void Compose()
        {
            try
            {
                AppDomain.CurrentDomain.FirstChanceException += FirstChanceHandler;
                AggregateCatalog aggregatecatalogue = new AggregateCatalog();
                aggregatecatalogue.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
                CompositionContainer container = new CompositionContainer(aggregatecatalogue);
                CompositionBatch batch = new CompositionBatch();
                batch.AddPart(this);
                container.Compose(batch);
            }
            catch (Exception ex)
            {
                throw ex;
            }

        }

        static void FirstChanceHandler(object source, FirstChanceExceptionEventArgs e)
        {
            System.Text.StringBuilder msg = new System.Text.StringBuilder();
            msg.AppendLine(e.Exception.GetType().FullName);
            msg.AppendLine(e.Exception.Message);
            System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
            msg.AppendLine(st.ToString());
            msg.AppendLine();
            String desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            string logFilePath = String.Format("{0}\{1}", desktopPath, "logfile.txt");
            System.IO.File.AppendAllText(logFilePath, msg.ToString());

        }

果然,我在输出中看到了window,发现确实是从GAC加载了这个DLL和ExpressApp相关的一些依赖。 问题:我如何确定在哪里以及为什么需要 ExpressApp? 我可以简单地只提供 DLL,但它会继续存在大量的依赖项,我知道为什么需要它们。

有用于检查托管程序集依赖项的工具。 MS Windows SDK 包含 ildasm.exe 实用程序。您可能已将其安装在:

C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\ildasm.exe

当我遇到类似的问题(dll 版本不匹配)时,我还使用命令行中的 cygwin 'grep' 在所有 DX 和我们的自定义程序集中搜索缺少的依赖字符串以找到实际的 . dll 文件引用缺少的依赖 dll 版本。然后在ildasm.exe中打开,双击MANIFEST树节点。在那里我看到了对我没有的 .dll 版本的引用。

您可以按照相同的步骤尝试跟踪丢失的依赖项。 运行 "DevExpress.ExpressApp" 字符串搜索项目 bin 目录中的所有 DX dll 然后如果找到结果,使用 ildasm.exe

打开报告的文件

请注意,很可能您没有安装 https://www.cygwin.com/ 软件包中的 'grep',因此请使用您可用的字符串搜索实用程序。

还有其他 3rd 方工具用于检查 dll 依赖性,但必须单独安装,而 ildasm.exe 是 Windows SDK 的一部分。请参阅此问题的其他工具参考答案:

How do I determine the dependencies of a .NET application?

更新:

如果您的 bin 文件夹中没有所有 DX 库,因为您的应用程序是一个插件并直接从 GAC 使用 DX 库,那么您可以直接在 DX 安装文件夹中搜索 DevExpress.ExpressApp 引用,就我而言:

C:\Program Files (x86)\DevExpress 15.2\Components\Bin\Framework

我已将上述文件夹内容复制到临时文件夹,删除了所有区域设置子文件夹以及所有 DevExpress.ExpressApp.* dll,然后 运行 命令:

grep -nr "DevExpress.ExpressApp"

产生了以下结果:

Binary file DevExpress.EasyTest.v15.2.dll matches
Binary file DevExpress.Persistent.Base.v15.2.dll matches
Binary file DevExpress.Persistent.BaseImpl.EF.v15.2.dll matches
Binary file DevExpress.Persistent.BaseImpl.v15.2.dll matches
Binary file DevExpress.Workflow.Activities.v15.2.Design.dll matches
Binary file DevExpress.Workflow.Activities.v15.2.dll matches

查看以上任何 dll 是否被您的插件或要部署插件的主机应用程序使用。

HTH