我需要的是:我有一个c#代码,我想构建它以便在桌面上创建一个.bat文件。因此,当我从桌面运行此.bat文件时,它应该执行c#代码。
有没有办法在编译之前更改c#项目的设置或属性,以便创建一个应运行此c#代码的.bat文件?
答案 0 :(得分:11)
将C#代码编译到控制台应用程序中。
然后使用批处理文件运行此应用程序。
在桌面上创建一个名为batch.bat(或whatever.bat)的文件,并在其中加入以下内容:
@echo off
[full path to your application]\[application name].exe [any additional parameters]
---替代----
在项目属性中,可以选择构建事件。在post build命令行中输入以下内容:
echo @echo off > [path to desktop batchfile].bat
echo $(TargetPath) >> [path to desktop batchfile].bat
答案 1 :(得分:3)
我理解你的问题,想要使用批处理程序编译C#源文件。假设您的C#源文件如下所示(另存为“test.cs”):
using System;
public class Print
{
public static void Main()
{
Console.WriteLine("Hurray I am printing to the CONSOLE!!");
}
}
您可以在命令提示符下编译如下:
csc /out:test.exe test.cs
将我们带到批处理文件:
@ECHO OFF
csc /out:test.exe test.cs
或者,通用化,从命令行中取出参数nr 1:
@ECHO OFF
csc /out:%1.exe %1
答案 2 :(得分:2)
作为替代方案,您可能需要考虑使用windows powershell而不是常规的旧命令行。 In the powershell you can work with arbitrary .net assemblies。换句话说,您不必在C#/ VB代码中执行任何操作来容纳命令行。
答案 3 :(得分:1)
@echo off
set csfile=%temp%\temp.cs
echo // C# code > %csfile%
echo using System; >> %csfile%
echo using System.Text; >> %csfile%
echo namespace HelloWorld >> %csfile%
echo { >> %csfile%
echo public class HelloWorldMain >> %csfile%
echo { >> %csfile%
echo public static void Main() >> %csfile%
echo { >> %csfile%
echo Console.WriteLine("Hello world!"); >> %csfile%
echo } >> %csfile%
echo } >> %csfile%
echo } >> %csfile%
csc /nologo /out:%temp%\temp.exe %csfile%
%temp%\temp.exe
pause
答案 4 :(得分:1)
是
set batchName=%userprofile%\desktop\runCSharp.bat
echo @echo off > %batchName%
echo "$(TargetPath)" >> %batchName%
echo pause >> %batchName%
这将在桌面上创建一个批处理文件,用于运行已编译的c#程序。
答案 5 :(得分:1)
您可以在dostips上查看self-compiled .net hybrids主题。
根据我的最好的技术是使用msbuild和内联任务的技术 - 它不会创建.exe
文件并且没有冗余输出:
<!-- :
@echo off
echo -^- FROM BATCH
set "CMD_ARGS=%*"
:::::: Starting C# code :::::::
:: searching for msbuild location
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#"
if not defined msb (
echo no .net framework installed
exit /b 10
)
rem :::::::::: calling msbuid :::::::::
call %msb% /nologo /noconsolelogger "%~dpsfnx0" /property:"H=From C#"
rem ::::::::::::::::::::::::::::::::::::
exit /b %errorlevel%
-->
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="_">
<_/>
</Target>
<UsingTask
TaskName="_"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" >
<ParameterGroup >
<Z ParameterType="System.String">$(H)</Z>
</ParameterGroup>
<Task>
<Using Namespace="System" />
<Code Type="Fragment" Language="cs">
<![CDATA[
String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
System.Console.WriteLine("-- "+"$(H)");
]]>
</Code>
</Task>
</UsingTask>
</Project>
唯一的一点是,对于命令行参数,您必须在批处理部分中创建一个变量(例如set "CMD_ARGS=*%"
),然后从C#代码中提取环境变量。
另一个注意事项是您不能在批处理部分中直接使用--
字符串,因为不会解析xml。
请注意第一行:
是重要的,因为它使用批处理文件的解析优先级 - 它将被解释为:<!--
,在执行期间将采用标签而不执行。
如果你想使用整个类,请遵循这个例子(你需要扩展ITask和Task和Execute方法):
<!-- :
@echo off
echo -^- FROM BATCH
set "CMD_ARGS=%*"
:::::: Starting C# code :::::::
:: searching for msbuild location
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#"
if not defined msb (
echo no .net framework installed
exit /b 10
)
rem :::::::::: calling msbuid :::::::::
call %msb% /nologo /noconsolelogger "%~dpsfnx0"
rem ::::::::::::::::::::::::::::::::::::
exit /b %errorlevel%
-->
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Program">
<Program/>
</Target>
<UsingTask
TaskName="Program"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" >
<Task>
<Reference Include="$(MSBuildToolsPath)\System.Windows.Forms.dll"/>
<Using Namespace="System" />
<Code Type="Class" Language="cs">
<![CDATA[
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using System;
public class Program:Task, ITask
{
public override bool Execute(){
Console.WriteLine("Whoa");
String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
System.Console.WriteLine("-- "+"$(MSBuildToolsVersion)");
return true;
}
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
如果您只需要几种方法(这么简单的片段不会起作用),而不是整个课程,您可以查看:
<!-- :
@echo off
echo -^- FROM BATCH
set "CMD_ARGS=%*"
:::::: Starting C# code :::::::
:: searching for msbuild location
for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do set "msb=%%#"
if not defined msb (
echo no .net framework installed
exit /b 10
)
rem :::::::::: calling msbuid :::::::::
call %msb% /nologo /noconsolelogger "%~dpsfnx0"
rem ::::::::::::::::::::::::::::::::::::
exit /b %errorlevel%
-->
<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="_">
<_/>
</Target>
<UsingTask
TaskName="_"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" >
<Task>
<Reference Include="$(MSBuildToolsPath)\System.Windows.Forms.dll"/>
<Using Namespace="System" />
<Code Type="Method" Language="cs">
<![CDATA[
public override bool Execute(){
MyMethod();
return true;
}
void MyMethod(){
Console.WriteLine("Whoa");
String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
System.Console.WriteLine("-- "+"$(MSBuildToolsVersion)");
}
]]>
</Code>
</Task>
</UsingTask>
</Project>
答案 6 :(得分:0)
您只需在桌面上创建执行以下操作的批处理文件
cd \<applicationdirectory>\bin\<release or debug depending on your build configuration>
START <application name>
您需要做的就是在桌面上创建一个.txt文件,将上面的命令放在文件中(使用正确的目录和名称),然后将文件重命名为.bat
答案 7 :(得分:0)
我知道这已经太晚了,但将来有些人可能会受益。
在vs中我们可以使用控制台应用程序编写批处理
开放vs - &gt;档案 - &gt;新 - &gt;项目 - &gt;控制台应用程序。
您可以在google中查询如何编写控制台应用程序。