System.EnterpriseServices.Internal.Publish.GacInstall 不工作但没有错误

System.EnterpriseServices.Internal.Publish.GacInstall not working but no errors

这是我的代码:

var s = new System.EnterpriseServices.Internal.Publish();
foreach (string file in Directory.EnumerateFiles(@"C:\Program Files\MyFolder\MSPractices"))
{
    Console.WriteLine("GACing " + file);
    s.GacInstall(file);
}

这些是我尝试添加到 GAC(版本 6.0.1304.0)的文件

Microsoft.Practices.EnterpriseLibrary.Caching.dll Microsoft.Practices.EnterpriseLibrary.Common.dll Microsoft.Practices.EnterpriseLibrary.Data.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.dll Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.dll Microsoft.Practices.EnterpriseLibrary.Logging.Database.dll Microsoft.Practices.EnterpriseLibrary.Logging.dll Microsoft.Practices.EnterpriseLibrary.PolicyInjection.dll Microsoft.Practices.EnterpriseLibrary.Security.dll Microsoft.Practices.EnterpriseLibrary.Validation.dll Microsoft.Practices.ServiceLocation.dll Microsoft.Practices.Unity.Configuration.dll Microsoft.Practices.Unity.dll Microsoft.Practices.Unity.Interception.Configuration.dll Microsoft.Practices.Unity.Interception.dll

它们是别人给我的,所以我不确定在哪里可以买到它们,但肯定可以在线获得。

代码正确输出了该列表并且没有抛出任何异常,但是 运行 gacutil /l 显示实际上只安装了其中的几个(下面突出显示)。

可能出了什么问题?

可能重要:我真正的问题是这在我的 InstallShield InstallScript 安装程序中不起作用(使用 EnterpriseServices.Internal.Publish 对象)。

UPDATE:

This method throws no exception! ...for anything! Publish pub = new Publish(); pub.GacInstall("foo");

No error, no exception. If the path is valid, and the assembly is strongly named, it will get properly installed in the GAC. Works for target .NET Frame version of assembly. I.e. a .NET Framework 4.0 app using GacInstall will properly install a 3.5 targeted assembly, etc.

Update (2011/12/13) - After using ILSpy to look at the code for this function, I did discover that errors are sent to the local machine's Event Viewer:

不幸的是,事件查看器中的所有事件都只说

Installation in the global assembly cache failed: foo

您已经得出结论,这些方法并不总是有用。

如果您想要更强大的方法,您可以使用 GAC/Fusion API 记录的 here and here. An example in C# can be found here (thanks to Hans Passant), here or here 从 C# 中实现。

您也可以尝试 gacutil.exe 看看问题出在哪里。您可以在安装了 Visual Studio 的计算机上找到它。

果然是Installshield。 EnterpriseLibrary 程序集的版本 6 以 .NET 4.0 为目标,并且由于 Installshield 仅构建 32 位 .exe,它正在调用无法注册 .NET 4.0 EnterpriseLibrary 程序集的 .NET 2.0 System.EnterpriseServices .dll。我添加了一个自定义 C# 工具来发布通过安装脚本调用的程序集。这很难看,但在我们可以转换为 WIX 之前必须这样做。

我今天遇到了类似的问题;机器已经重新启动。 我在非管理员模式下打开 Powershell ISE,运行 相同的脚本我有 运行 100 秒的时间,它表现得像 运行 但它没有。问题是以管理员身份打开的。