我在以下路径中设置了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;
}
}
答案 0 :(得分:1)
好。我暂时解决了这个问题。插件签名的事实似乎是一个红色的鲱鱼。
正在签名的Core.DLL比正在签名的插件更大的问题。 Core.DLL文件无法正确加载(如果有的话)。结果,在那个事实之后的所有其他事情都有争议和质疑。
目前,我已经使用sn.exe跳过了对Core.DLL的验证。我现在将此标记为的答案。我想知道为什么我必须跳过Core.DLL的验证;是因为EXE没有签名?