如何将引用项目B中的指定DLL发布至引用项目的App_Data文件夹
解决将项目B中的DLL发布到项目A的App_Data文件夹的方法
我之前也碰到过一模一样的问题——单纯靠调整文件的生成操作和「复制到输出目录」属性,确实搞不定跨项目的DLL定向发布需求。试试下面这几个靠谱的办法:
方法一:用Post-build事件直接复制
这是最直接的方案,给项目B加个构建后事件,把目标DLL主动拷贝到项目A的App_Data目录,同时确保发布时能带上:
- 右键项目B → 属性 → 生成事件 → 编辑「Post-build事件命令行」
- 输入类似这样的命令(记得替换成你的实际文件名和路径):
xcopy "$(TargetDir)YourTargetDll.dll" "$(SolutionDir)ProjectA\App_Data\" /Y /R
参数说明:
$(TargetDir):项目B编译后输出文件的目录,是VS内置的宏变量,不用手动写绝对路径$(SolutionDir):你的解决方案根目录,同样是内置宏,适配不同环境/Y:覆盖现有文件时不弹出提示/R:强制覆盖只读文件
之后还要在项目A里把App_Data里的这个DLL「添加为现有项」,然后设置它的属性:
- 生成操作:内容
- 复制到输出目录:如果较新则复制
方法二:通过MSBuild脚本控制发布行为
如果Post-build事件不够灵活,直接修改项目A的.csproj文件,添加自定义MSBuild任务,确保发布时自动把DLL拷贝到指定位置:
- 右键项目A → 卸载项目 → 编辑项目A的
.csproj文件 - 在文件末尾的
</Project>标签前,插入这段脚本(替换文件名和路径):
<Target Name="CopyDllToAppDataOnPublish" AfterTargets="Publish"> <Copy SourceFiles="$(SolutionDir)ProjectB\bin\$(Configuration)\YourTargetDll.dll" DestinationFolder="$(PublishDir)App_Data\" OverwriteReadOnlyFiles="true" SkipUnchangedFiles="false" /> </Target>
这样每次发布项目A时,MSBuild都会自动把项目B的目标DLL复制到发布目录的App_Data文件夹里。
方法三:调整项目引用的依赖配置
先检查项目A对项目B的引用设置,确保基础依赖没问题:
- 右键项目A的引用列表 → 选中项目B → 查看属性
- 确认「复制本地」设置为
True(这个默认会把DLL复制到项目A的bin目录,之后再结合上面的方法把bin里的DLL移到App_Data即可)
另外要注意:如果用Visual Studio的Web Deploy发布,要在发布配置的「文件发布选项」里勾选「保留额外的文件(在目标位置)」,确保App_Data文件夹和里面的文件不会被发布过程忽略。
内容的提问来源于stack exchange,提问作者Dennis van Gils




