2008-12-10 84 views
3

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

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

我发现解决问题的唯一方法是“复制本地”SDK.dll及其所有依赖项(我因为部署问题而无法执行的操作),或将我的程序编译到与SDK相同的目录中.dll

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

回答

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; 
} 
+0

比ks,我试图做类似的事情。 – Epu 2011-08-26 20:34:40

0

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

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

BeowulfOF

+0

问题是我不允许在GAC中注册该DLL ... – Sakin 2008-12-10 15:47:59

0

回复:Snooganz

你可能打算用装载文件代替负荷的,就像这样:

Assembly theAssembly = Assembly.LoadFile(assemblyFullName); 

Assembly.Load将可能让你进入无限循环=)

+0

只要由“assemblyFullName”指向的程序集存在,就没有无限循环。只有在程序集找不到时才会触发AssemblyResolve事件,因此在调用Assembly.Load(assemblyFullName)时不会再次触发它。示例代码只是为了演示如何处理事件......您当然应该在适当的地方插入错误检查(例如检查程序集存在)。 – Snooganz 2010-01-20 05:12:07