我需要开发一个Shell Context Menu扩展,引用其他一些自定义程序集......我不想为这些自定义程序集分配一个强名称密钥!
我遵循的guide 使用了SharpShell项目并说明了如何签署(但没有解释为什么)程序集...这是我的问题:如果我签署我的最终.dll然后我在我的项目构建阶段有很多错误,因为我的项目引用的一些程序集没有强名称("引用程序集没有强名称")。
一般来说,谷歌搜索C#Shell扩展实现,我发现所有最好的教程签署最终程序集...是强制性的吗?
不签署程序集ServerManager.exe会返回此错误:" The file 'XYZ.dll' is not a SharpShell Server
"。
答案 0 :(得分:1)
最后我解决了我的烦恼...通过NuGet获得的SharpShell.dll
文件是ServerManager.exe
个版本的不同版本。
卸载SharpShell NuGet包并直接引用您在ServerManager文件夹中找到的SharpShell.dll是我的解决方案!
此外,我正在查看文章评论之间......请阅读this问题。
答案 1 :(得分:0)
您不需要使用旧的DLL。 请直接使用此代码,而不使用ServerManager.exe。
private static ServerEntry serverEntry = null;
public static ServerEntry SelectedServerEntry
{
get
{
if (serverEntry == null)
serverEntry = ServerManagerApi.LoadServer("xxx.dll");
return serverEntry;
}
}
public static ServerEntry LoadServer(string path)
{
try
{
// Create a server entry for the server.
var serverEntry = new ServerEntry();
// Set the data.
serverEntry.ServerName = Path.GetFileNameWithoutExtension(path);
serverEntry.ServerPath = path;
// Create an assembly catalog for the assembly and a container from it.
var catalog = new AssemblyCatalog(Path.GetFullPath(path));
var container = new CompositionContainer(catalog);
// Get the exported server.
var server = container.GetExport<ISharpShellServer>().Value;
serverEntry.ServerType = server.ServerType;
serverEntry.ClassId = server.GetType().GUID;
serverEntry.Server = server;
return serverEntry;
}
catch (Exception)
{
// It's almost certainly not a COM server.
MessageBox.Show("The file '" + Path.GetFileName(path) + "' is not a SharpShell Server.", "Warning");
return null;
}
}
安装代码:
ServerRegistrationManager.InstallServer(SelectedServerEntry.Server, RegistrationType.OS64Bit, true);
注册码:
ServerRegistrationManager.RegisterServer(SelectedServerEntry.Server, RegistrationType.OS64Bit);