.NET中的程序集绑定问题

时间:2008-12-10 14:00:49

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

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

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

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

有没有办法告诉SDK.dll在哪里查找它的依赖项,无论它的位置如何?也许SDK.dll.config文件可以帮忙吗?

5 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

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

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

BeowulfOF

答案 2 :(得分:0)

你不能GAC SDK,但你可以GAC的依赖吗?

另请阅读有关装配绑定的msdn文章:

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

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

答案 3 :(得分:0)

答案 4 :(得分:0)

回复:Snooganz

您可能意味着使用Load 文件而不是Load,如下所示:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName);

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