【问题标题】:Install an assembly into GAC programmatically以编程方式将程序集安装到 GAC 中
【发布时间】:2012-09-12 07:07:15
【问题描述】:

我需要使用 c# 在 GAC 中安装程序集。以下是我的代码:

new System.EnterpriseServices.Internal.Publish().GacInstall("MyAssembly.dll");

上面的代码给出了错误:

需要绝对路径

但我需要在不使用静态文件路径(绝对路径)的情况下运行它。谁能告诉我这是否可能?我在项目引用中添加了对程序集的引用。我需要在 GAC 中安装这个程序集。

【问题讨论】:

  • 你能用gacutil.exe和Process.Start()吗?
  • 我需要在 c# 项目中以编程方式完成
  • 嗯。在尝试安装之前,在运行时将文件路径解析为绝对路径?
  • 对。以编程方式调用Process.Start("gacutil.exe", "/i MyAssembly.dll");

标签: c# .net exception-handling gac


【解决方案1】:

你可以这样做:

GacInstall((new System.IO.FileInfo("MyAssembly.dll")).FullName);

或者,

GacInstall(System.IO.Path.GetFullPath("MyAssembly.dll"));

假设文件在您当前的工作目录中。如果不是,那么您需要定义用于查找此 DLL 的规则(例如,它与您当前的可执行文件在同一路径中吗?)

【讨论】:

    【解决方案2】:

    试试我想出的下面这个,让我知道这是否有效

    Assembly assembly = Assembly.GetAssembly(typeof(Program));//Replace your Type here.
    string filePath = assembly.Location; 
    

    然后使用这个文件路径。

    【讨论】:

    • 只有从执行 GAC 安装的程序中引用程序集时才有效。
    【解决方案3】:

    如果您知道关于您的可执行文件的DLL 的相对路径,请制作

    string executableDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    string assemblyFullPath = Path.Combine(executableDirectory,
                                relativePathToAssembly);
    

    应该为你工作。

    【讨论】:

    • 如果进程在启动后更改了当前目录,或者进程启动时使用的当前目录与正在执行的程序集的文件夹不同,这将不起作用。正确的方法是使用Environment.CurrentDirectory。
    • @atornblad:您也可以设置 Environment.CurrentDirectory,通过在执行期间更改它的路径等等,它是操作系统信息,它不会以任何方式反映您的应用程序设置。
    • 这个问题没有提到只想注册与正在执行的应用程序位于同一目录中的 dll。
    • @atornblad:你会得到这些程序集的路径。
    【解决方案4】:

    错误本身表明,您需要提供 dll 所在的完整位置路径。即路径中的C:\myprojects\myassembly.dll

    【讨论】:

      【解决方案5】:

      在c#中将“.dll”文件添加到全局程序集缓存的简单步骤:

      1. 在您的项目中,“添加引用”到要在 GAC 中安装的 .dll 文件
      2. 形成参考,右键单击特定的 .dll 文件并选择“属性”
      3. 将属性“复制本地”更改为“真”
      4. 使用 wspBuilder 构建和部署
      5. 为了验证,只需在清单文件中检查路径是否存在以及“C:\Windows\assembly”中。

      【讨论】:

      • 恢复这个,对不起。但这并不完全是一种编程方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多