3

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

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

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

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

4

5 回答 5

8

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

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;
}
于 2008-12-10T15:25:58.227 回答
0

要在 GAC 中注册您的程序集,它必须使用强名称进行签名。

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

贝奥武夫

于 2008-12-10T14:05:29.967 回答
0

您不能 GAC SDK 但您可以 GAC 依赖项吗?

另请阅读有关程序集绑定的 msdn 文章:

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

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

于 2008-12-10T14:10:10.657 回答
0

尝试使用 DEVPATH 环境变量。

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

于 2008-12-10T14:53:41.617 回答
0

回复:Snooganz

您可能的意思是使用加载文件而不是加载,如下所示:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

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

于 2009-09-29T14:17:37.297 回答