我有一个基于MVC / C#的网站。使用的nuget软件包之一是PDFium(非.NET dll)的包装。 PDFium dll是另一个nuget软件包的一部分,只是一个被复制到输出目录中的dll。
我遇到的问题是,在我使用网站后,PDFium dll(即非.net,而不是正在包装的那个)似乎已被加载,然后被IIS锁定。如果然后尝试在Visual Studio中进行构建,则会收到一条错误消息:
无法复制文件[完整源路径]。该进程无法访问文件[目标路径],因为它正在被另一个进程使用。
构建错误日志中的第二行显示类似内容,并另外确认:
该文件被锁定:“ IIS工作进程(28776)”
如果我执行iisreset
,那么这将导致该工作进程被杀死,因此可以进行复制,但是我想知道是否有任何更好的方法可以做到这一点。我的想法是,将nuget软件包中包含的所有其他DLL以及类似的DLL复制都很好,因此也许可以解决此问题而不是稍微费力的iisreset方法就可以做得更“适当”了。
答案 0 :(得分:1)
不确定是否有任何帮助,但是为了避免IISReset,一种选择是确保IIS使用的PDFium.DLL不是在构建过程中复制到项目目标目录的目录。但是,如果PDFium.DLL必须与包装程序集位于同一文件夹中(我怀疑是这样),则除了使用IISReset之外,您可能没有其他选择。您可以按照此处(How to restart the IIS Site when re-compiling an asp.net website)的建议添加预构建脚本,从而省去了手动操作。
如果PDFium.DLL不必与包装器位于同一文件夹中,并且可以在系统上的任何位置注册,则可以尝试将引用的Copy Local属性设置为false,以便不尝试复制。显然,这只有在包装程序可以通过其注册表项找到DLL的情况下才能起作用-如果可以注册...