我正在编写一个.NET库,由于各种原因无法在GAC中注册。 这个dll(我们称之为SDK.dll)依赖于其他DLL来加载。
编写使用此SDK.dll的程序时,我注意到我的程序无法在抛出FileNotFoundException的情况下加载dll。发生这种情况是因为虽然我能够找到引用的SDK.dll,但CLR无法加载其依赖项。
我找到解决问题的唯一方法是“复制本地”SDK.dll及其所有依赖项(由于部署问题我无法做到),或者将我的程序编译到与SDK相同的目录中。 DLL
有没有办法告诉SDK.dll在哪里查找它的依赖项,无论它的位置如何?也许SDK.dll.config文件可以帮忙吗?
答案 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)
答案 2 :(得分:0)
你不能GAC SDK,但你可以GAC的依赖吗?
另请阅读有关装配绑定的msdn文章:
http://msdn.microsoft.com/en-us/library/efs781xb(VS.71).aspx
如果您的程序集是强名称的,您可以使用代码库,如果它们不是代码库,则必须是您的isntall的子目录,这将无济于事。
答案 3 :(得分:0)
尝试使用DEVPATH env变量。
答案 4 :(得分:0)
回复:Snooganz
您可能意味着使用Load 文件而不是Load,如下所示:
Assembly theAssembly = Assembly.LoadFile(assemblyFullName);
Assembly.Load
可能会让你陷入无限循环=)