在Visual Studio

时间:2017-02-02 20:32:42

标签: c# visual-studio

我的情况很不寻常。

问题

我正在使用Visual Studio(VS)编写脚本以使用in-game in the game Space Engineers

问题是你只使用游戏中文件的一部分代码。 (I.E,Ctrl + A不会这样做)。因此,选择正确的部分是乏味的。

我想简化在VS中复制所需代码并将其粘贴到Space Engineers中的过程。 想法是修剪所有不必要的空白区域(有一个字符限制)并在按下VS中运行时复制到剪贴板。

我在哪里

我发现您可以创建自己的构建配置并使用“预构建事件命令行”来运行自定义的东西。我们的想法是创建一个简单的控制台应用程序,完成上面描述的操作。但我不知道如何将正确的文件发送到所述应用程序。

我是否在正确的轨道上?如何将所需文件发送到修剪应用程序?还有更好的方法吗?

修改 当我说“简单的控制台应用程序”时,这就是我的想法。 它做了我需要它做的一切(修剪空白区域并将一部分代码添加到剪贴板)。唯一缺少的是我必须指定我想要它使用的文件名。这不重要,它会很好。

using System;
using System.Windows.Forms;

namespace TrimFileToClipboard
{
    class Program
    {
        [STAThread()]
        static void Main(string[] args)
        {
            string startString = (args.Length > 1) ? "#region " + args[1] : "#region in-game";
            string line;
            string trimmed = "";
            bool read = false;
            int depth = 0;

            System.IO.StreamReader file = new System.IO.StreamReader(args[0]);
            while ((line = file.ReadLine()) != null)
            {
                if (!read && line.Contains(startString)) read = true;
                else if (read && line.Contains("#region")) depth++;
                else if (read && line.Contains("#endregion"))
                {
                    if (depth == 0) break;
                    else if (depth < 0)
                    {
                        Console.WriteLine("There's something wrong with your #regions. Please edit the file.");
                        Console.ReadLine();
                        Environment.Exit(0);
                    }
                    else depth--;
                }
                else if (read) trimmed += line.Trim() + "\n";
            }
            file.Close();

            Clipboard.SetText(trimmed);
        }
    }
}

可以通过添加来使用 "<path>\TrimFileToClipboard.exe" "$(ProjectDir)<classname>.cs" 在项目属性/构建事件中预构建事件命令行。其中<path>是上述应用程序的路径,<classname>是您要处理的文件。

也许我应该发布这个部分作为答案,但我不知道这是一个体面的方法还是一个丑陋的黑客。

2 个答案:

答案 0 :(得分:1)

不是将代码复制到剪贴板,而是使用这个简单的C#控制台应用程序将其直接保存在游戏中作为已保存的工作室脚本。

我使用VS编辑的SE脚本包含注释\\script-begin\\script-end,以告诉应用程序在哪里查找需要在可编程块中的实际代码。

执行后,脚本将在本地研讨会上提供。这使得使用SE脚本变得非常容易,每当我使用VS进行更改时,我再次运行控制台应用程序并且脚本将在游戏内更新。

internal class Program
{
    private static void Main(string[] args)
    {
        String[] InputLines, outputLines;
        Int32 scriptBegin = 0, scriptEnd = 0;

        String scriptName = args[0];
        String inputPath = "C:\\Users\\hfand\\source\\repos\\se-scripts\\" + scriptName + ".cs";

        if (File.Exists(inputPath))
        {
            InputLines = File.ReadAllLines(inputPath);

            for (int i = 0; i < InputLines.Length; i++)
            {
                if (InputLines[i].Contains("script-begin"))
                {
                    scriptBegin = i + 1;
                }
                if (InputLines[i].Contains("script-end"))
                {
                    scriptEnd = i - 1;
                }
            }

            outputLines = new List<string>(InputLines).GetRange(scriptBegin, scriptEnd - scriptBegin + 1).ToArray();

            for (int i = 0; i < outputLines.Length; i++)
            {
                if (outputLines[i].Length >= 8)
                {
                    outputLines[i] = outputLines[i].Substring(8);
                }
            }

            String outputPath = "C:\\Users\\hfand\\AppData\\Roaming\\SpaceEngineers\\IngameScripts\\local\\" + scriptName;

            if (Directory.Exists(outputPath))
            {
                File.WriteAllLines(outputPath + "\\Script.cs", outputLines);
            }
            else
            {
                Directory.CreateDirectory(outputPath);
                File.WriteAllLines(outputPath + "\\Script.cs", outputLines);
            }

            Console.WriteLine(scriptName + " sincronizado");
        }
        else
        {
            Console.WriteLine("Arquivo \"" + inputPath + "\" não encontrado");
        }
    }
}

以下是VS中的代码应如何显示的示例

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using VRageMath;
using VRage.Game;
using Sandbox.ModAPI.Interfaces;
using Sandbox.ModAPI.Ingame;
using Sandbox.Game.EntityComponents;
using VRage.Game.Components;
using VRage.Collections;
using VRage.Game.ObjectBuilders.Definitions;
using VRage.Game.ModAPI.Ingame;
using SpaceEngineers.Game.ModAPI.Ingame;

namespace BlankScript
{
    public class Program : MyGridProgram
    {
        //script-begin
        public Program()
        {
        }

        public void Save()
        { 
        }

        public void Main(string argument, UpdateType updateSource)
        {
        }
        //script-end
    }
}

答案 1 :(得分:0)

您可以使用我的Visual Commander扩展编写一个C#命令,该扩展在Visual Studio中以DTE.ActiveWindow.Document.FullName的形式获取活动文件路径,然后在其上运行file.ReadLine()并调用Clipboard.SetText(trimmed)在末尾。请参阅示例Copy current file, line, method示例代码。