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 对象)。
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 秒的时间,它表现得像 运行 但它没有。问题是以管理员身份打开的。
这是我的代码:
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 对象)。
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 秒的时间,它表现得像 运行 但它没有。问题是以管理员身份打开的。