在MEF中加载延迟签名的程序集

时间:2014-03-04 18:25:15

标签: c# .net mef

我在以下路径中设置了Windows服务:

C:\Avalanche\Services\Avalanche.EXE
C:\Avalanche\Services\Core.DLL

Core.DLL非常重要。这是延迟签署;它包含要为任何插件导出的接口

接下来,我有一个插件文件夹:

C:\Avalanche\Snowballs\

我在这里插入的插件是延迟签名的,并且是针对正确版本的Core.DLL构建的,与Services文件夹中的相同。

我的问题是,在运行时,MEF似乎根本没有看到插件。它加载它们,但似乎无法用它做任何事情。但如果我没有签署任何东西,那就没有问题了。我签署插件的原因是出于版本原因。如果我制作一个插件的v1并安装它,然后构建相同插件的v2并安装它(不弹跳服务),MEF将加载v1两次;这不是我想要的。这通常不是问题,但这项服务旨在保持相当长的一段时间(几天,几个月)。

如何让MEF看到这些延迟签名的程序集?它似乎甚至没有把它们捡起来。

注意:我已经尝试过不对程序集进行延迟签名。这会产生FileLoadException。我还注册了程序集以进行验证跳过(通过sn并让它导出我安装的reg文件)。

这是加载插件的Core.DLL中的代码。

// Setup
iCatalog = new AggregateCatalog();
iWatcher = new List<FileSystemWatcher>();
List<DirectoryCatalog> oDirectories = new List<DirectoryCatalog>();

// Make sure all the folders exist; add them to the aggregate catalog.
// NOTE: aLocations is a string[] of directories that are to be used.
foreach (String sFolder in aLocations)
{
if (Directory.Exists(sFolder))
    {
        DirectoryCatalog oDirectoryCatalog = new DirectoryCatalog(sFolder);
        iCatalog.Catalogs.Add(oDirectoryCatalog);        
        oDirectories.Add(oDirectoryCatalog);
    }
}

iDirectories = oDirectories as IEnumerable<DirectoryCatalog>;

// Now then, create our CompositionContainer and compose the parts
iContainer = new CompositionContainer(iCatalog);
iContainer.ComposeParts(this);

这是一个示例插件:

[Export(typeof(Core.Contracts.ISnowballPlugin))]
public class CSharpSample : Core.Contracts.ISnowballPlugin
{
    private CSharpSampleSnowball iSnowball = new CSharpSampleSnowball();
    public Core.Snowball.Snowball Snowball
    {
        get { return iSnowball; }
    }

    public TimeSpan Frequency
    {
        get { return TimeSpan.FromSeconds(2); }
    }

    public string Grouping
    {
        get { return "None"; }
    }

    public TimeSpan? Timeout
    {
        get { return null; }
    }
}

public class CSharpSampleSnowball : Core.Snowball.Snowball
{
    public CSharpSampleSnowball()
        : base("CSharp Example Version 2.0", "An example C# snowball")
    {

    }

    protected override void Run()
    {
        return;
    }
}

1 个答案:

答案 0 :(得分:1)

好。我暂时解决了这个问题。插件签名的事实似乎是一个红色的鲱鱼。

正在签名的Core.DLL比正在签名的插件更大的问题。 Core.DLL文件无法正确加载(如果有的话)。结果,在那个事实之后的所有其他事情都有争议和质疑。

目前,我已经使用sn.exe跳过了对Core.DLL的验证。我现在将此标记为的答案。我想知道为什么我必须跳过Core.DLL的验证;是因为EXE没有签名?