C# NET中的程序集绑定问题
我正在写一个.NET库,由于各种原因无法在GAC注册。 这个dll(我们称之为SDK.dll)依赖于其他dll才能加载 在编写使用此SDK.dll的程序时,我注意到我的程序加载dll失败,并引发FileNotFoundException。发生这种情况的原因是,尽管我能够找到引用的SDK.dll,但CLR未能加载其依赖项 我发现解决此问题的唯一方法是“本地复制”SDK.dll及其所有依赖项(由于部署问题,我无法执行此操作),或者将我的程序编译到与SDK.dll相同的目录中C# NET中的程序集绑定问题,c#,.net,app-config,assembly.load,C#,.net,App Config,Assembly.load,我正在写一个.NET库,由于各种原因无法在GAC注册。 这个dll(我们称之为SDK.dll)依赖于其他dll才能加载 在编写使用此SDK.dll的程序时,我注意到我的程序加载dll失败,并引发FileNotFoundException。发生这种情况的原因是,尽管我能够找到引用的SDK.dll,但CLR未能加载其依赖项 我发现解决此问题的唯一方法是“本地复制”SDK.dll及其所有依赖项(由于部署问题,我无法执行此操作),或者将我的程序编译到与SDK.dll相同的目录中 有没有一种方法可以告诉S
有没有一种方法可以告诉SDK.dll在何处查找它的依赖项,而不管它位于何处?也许SDK.dll.config文件会有所帮助?要在GAC中注册程序集,它必须使用签名 如果它依赖于其他程序集,则这些程序集应位于GAC to中
BeowulfOF您不能添加SDK,但可以添加依赖项吗 另请阅读此msdn关于程序集绑定的文章:
如果程序集是强名称的,则可以使用代码库,如果不是,则代码库必须是isntall的子目录,这不会有帮助。尝试使用DEVPATH env变量
您可以通过订阅此事件在运行时处理此问题:
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;
}
回复:Snooganz
您可能打算使用LoadFile而不是Load,如下所示:
Assembly theAssembly = Assembly.LoadFile(assemblyFullName);
Assembly.Load
可能会让您进入无限循环=)只要“assemblyFullName”指向的程序集存在,就不存在无限循环。只有在找不到程序集时才会激发AssemblyResolve事件,因此在调用assembly.Load(assemblyFullName)时不会再次激发它。示例代码只是演示如何处理事件……当然,您应该在适当的地方插入错误检查(例如检查程序集是否存在)。谢谢,我也尝试过类似的操作。