【问题标题】:Assembly binding problems in .NET.NET 中的程序集绑定问题
【发布时间】:2008-12-10 14:00:49
【问题描述】:

我正在编写一个 .NET 库,由于各种原因无法在 GAC 中注册。 这个 dll(我们称之为 SDK.dll)依赖于其他 DLL 才能被加载。

在编写使用此 SDK.dll 的程序时,我注意到我的程序无法加载 dll 并引发 FileNotFoundException。发生这种情况是因为虽然我能够找到引用的 SDK.dll,但 CLR 未能加载其依赖项。

我发现解决该问题的唯一方法是“复制本地”SDK.dll 及其所有依赖项(由于部署问题我不能这样做),或者将我的程序编译到与 SDK 相同的目录中。 dll

有没有办法告诉 SDK.dll 去哪里寻找它的依赖项而不管它的位置?也许 SDK.dll.config 文件可以提供帮助?

【问题讨论】:

    标签: c# .net app-config assembly.load


    【解决方案1】:

    您可以通过订阅此事件在运行时处理此问题:

    AppDomain.CurrentDomain.AssemblyResolve
    

    它在运行时无法解析程序集时触发。在您的事件处理程序方法中,编写您的逻辑以查找程序集并使用 Assembly.LoadFrom() 加载它。它看起来像这样:

    public SDKClass()
    {
      AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(FindAssembly);
    }
    
    private Assembly FindAssembly(object sender, ResolveEventArgs args)
    {
      string assemblyPath = "c:\PathToAssembly";
      string assemblyName = args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll";
      string assemblyFullName = Path.Combine(assemblyPath, assemblyName);
    
      Assembly theAssembly = Assembly.Load(assemblyFullName);
    
      return theAssembly;
    }
    

    【讨论】:

    • 谢谢,我正在尝试做类似的事情。
    【解决方案2】:

    要在 GAC 中注册您的程序集,它必须使用 strong name 签名。

    如果它依赖于其他程序集,那些应该在 GAC 中。

    BeowulfOF

    【讨论】:

      【解决方案3】:

      您不能对 SDK 进行 GAC,但您可以对依赖项进行 GAC 吗?

      另请阅读这篇关于程序集绑定的 msdn 文章:

      http://msdn.microsoft.com/en-us/library/efs781xb(VS.71).aspx

      如果你的程序集是强命名的,你可以使用代码库,如果不是,代码库必须是你的 isntall 的子目录,这无济于事。

      【讨论】:

        【解决方案4】:

        尝试使用 DEVPATH 环境变量。

        http://msdn.microsoft.com/en-us/library/cskzh7h6.aspx

        【讨论】:

          【解决方案5】:

          回复:Snooganz

          您的意思可能是使用 LoadFile 而不是 Load,如下所示:

          Assembly theAssembly = Assembly.LoadFile(assemblyFullName);
          

          Assembly.Load 可能会让你陷入无限循环 =)

          【讨论】:

          • 只要“assemblyFullName”指向的程序集存在,就没有无限循环。仅当找不到程序集时才会触发 AssemblyResolve 事件,因此在调用 Assembly.Load(assemblyFullName) 时不会再次触发它。示例代码只是为了演示如何处理事件...您当然应该在适当的地方插入错误检查(例如检查程序集是否存在)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-16
          • 2021-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多