VS后构建事件

12
我希望实现一个后构建事件,执行以下操作:
  1. 复制 DLL 输出的相对路径(1 个文件,不包括所有调试文件)
  2. 将输出的 DLL 注册到 GAC
如何实现?
8个回答

16

那符合你的需求吗?

copy $(TargetPath) $(TargetDir)..\..\someFolder\myoutput.dll
regasm $(TargetPath) 

(输入到项目属性下的后构建步骤字段)


7
在Microsoft Visual Studio 2010中,这将会失败并显示9009错误:您需要使用regasm的完整路径,如下所示:C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe $(TargetPath)。 - Contango

8
将以下内容输入到“项目属性->构建事件->后期构建事件命令行:”
xcopy "$(TargetPath)" "target path" /Y && regasm "$(TargetPath)"

或者将以下代码片段添加到项目(例如csproj)文件中。
<PropertyGroup>
    <PostBuildEvent>xcopy "$(TargetPath)" "target path" /Y && regasm "$(TargetPath)"</PostBuildEvent>
</PropertyGroup>

请注意,在复制命令参数周围添加 "" 是推荐的,以避免包含空格的路径问题。此外,请注意可以使用 && 组合多个命令。

5

你确定要将这个作为编译的一部分吗?如果可以避免,我建议在解决方案中使用项目引用而不是 GAC。复制文件是一回事,但在 GAC 中注册则相当具有侵入性,你可能需要考虑其他编译环境。例如,其他开发人员的机器、测试环境/构建服务器等。如果你有一个构建服务器,真的应该使用类似 NAnt 的东西,配合某种持续集成服务器。


2

我曾经也遇到过同样的问题,花费了一些时间才使它正常工作。

在我的情况下,我想要做相反的事情,即将SDL dll文件复制到我的输出文件夹中。

copy "$(SolutionDir)SDL\lib\x86\SDL.dll" "$(SolutionDir)$(Configuration)\"

请注意,$(Configuration) 将是您的输出文件夹(例如 Debug 或 Release)。
引号是我错过的部分,显然当右侧以 \ 结尾时需要它们。因此,最好始终使用它们。
希望能为其他人节省 5 分钟!
附注:我使用的是 Visual Studio 2010。

1

1

这个问题比较老了。最简单的方法是在你的.csproj文件中添加类似以下的内容。例如,我正在虚拟机上运行一些测试,编译后将其发送到虚拟机非常方便:


<Project>
    ...
     <!-- Upload to virtual machine -->
    <Target Name="rsync" AfterTargets="Build">
        <Exec Command="C:\Windows\System32\wsl.exe rsync -azv -e 'ssh -i /path/to/my/private/key' --delete  /mnt/c/repos/MyProject/bin/Debug/net7.0/ root@vm.ublux.com:/usr/share/foo/" />
    </Target>
</Project>


1

是的,MSBuild非常适合这个。如果想要留在Visual Studio中,您也可以在项目属性下输入后构建命令。 - Dirk Vollmar

0
遇到了一个相关的问题。这里的答案帮了我(谢谢!)。
我的情况是在调试一个依赖MEF的应用程序时,我需要将相关的DLL放在特定的位置。我遇到了覆盖之前构建的问题,所以需要在脚本中添加删除操作。
delete $(SolutionDir)FileService\$(ProjectName).dll
copy $(TargetPath) $(SolutionDir)FileService\$(ProjectName).dll

希望这也能帮到其他人!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接