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

时间:2015-12-02 14:23:30

标签: c# installshield gac installscript

这是我的代码:

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会显示实际安装的只有少数(下面突出显示)。

enter image description here

可能出现什么问题?

可能非常重要:我的真正问题是,这在我的InstallShield InstallScript安装程序中不能使用类似的代码(使用EnterpriseServices.Internal.Publish对象)。

UPDATE

  

此方法不会引发任何异常! ...为了任何东西!   Publish pub = new Publish(); pub.GacInstall("foo");

     

没有错误,没有例外。如果路径有效,并且程序集是   强名称,它将在GAC中正确安装。效劳于   目标.NET Frame版本的程序集。即.NET Framework 4.0应用程序   使用GacInstall将正确安装3.5目标程序集等。

     

更新(2011/12/13) - 使用ILSpy查看此代码后   功能,我确实发现错误被发送到本地机器   事件查看器:

不幸的是,事件查看器中的所有事件仅表示

  

全局程序集缓存中的安装失败:foo

3 个答案:

答案 0 :(得分:3)

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

如果您想要一种更强大的方法,可以使用记录在案herehere的GAC / Fusion API从C#中执行此操作。可以找到C#中的示例here(感谢Hans Passant),herehere

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

答案 1 :(得分:1)

它确实是Installshield。 EnterpriseLibrary程序集的第6版以.NET 4.0为目标,因为Installshield只构建32位.exes,所以它调用了.NET 2.0 System.EnterpriseServices .dll,它无法注册.NET 4.0 EnterpriseLibrary程序集。我添加了一个自定义C#工具来发布通过installscript调用的程序集。这很丑陋,但我们必须做,直到我们可以转换为WIX。

答案 2 :(得分:0)

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