Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中的程序集绑定问题_C#_.net_App Config_Assembly.load - Fatal编程技术网

C# NET中的程序集绑定问题

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

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

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

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


有没有一种方法可以告诉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)时不会再次激发它。示例代码只是演示如何处理事件……当然,您应该在适当的地方插入错误检查(例如检查程序集是否存在)。谢谢,我也尝试过类似的操作。