我已经搜索了很长时间,但没有看到答案。
我在 wcf 服务库中引用了两个 dll,它们是 .NET 的 C++ 库 API,从 wcftestclient 调用包装方法时它工作正常。但是当在 web 服务中自行托管库时,它会说“找不到程序集 xxx.dll(它是 c++ API dll 之一)或其依赖项之一”。但我可以看到它说缺少的 dll 被自动复制到主机 webserive 项目的 bin/debug 文件夹中。此外,我可以在一个简单的控制台项目中托管该库,在该项目中调用包装器方法完全没有问题。
我希望这是一个简单的配置设置,我没有在网络配置文件中指定,有人有什么建议吗?谢谢。
最佳答案
我在这个问题上花了将近三天的时间,现在已经解决了。如果这可以帮助其他可能遇到相同情况的人,这就是原因。
这两个 c++ 库 .net api dll 是后期绑定(bind)的,因此它直到运行时才会查找其依赖项。我什至尝试在 GAC 中注册整个外部库包,但没有帮助;这是因为两个 .net api dll 之一是一个弱程序集,因此 CLR 甚至不会费心在 GAC 中寻找它。我所做的是为服务创建一个静态构造函数,并在静态构造函数中将后期绑定(bind)程序集加载到 AppDomain 中。我正在使用 Assembly.LoadFrom(string filePath)
方法(Assembly 类上有其他方法可以执行此操作)。现在我可以在 IIS 上托管该服务并在任何客户端中使用它。因此,如果 clr 提示找不到程序集,但您可以在 bin/debug 文件夹中看到它,则它可能是一个延迟绑定(bind)程序集,需要将其预加载到 AppDomain 中; AppDomain 的好处是您只需加载程序集一次,它永远不会卸载单个程序集。
关于c# - 在 wcf 服务中引用 c++ 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26979025/