我尝试按照在线教程学习如何创建和注册 Visual Studio 文件生成器(又名自定义工具)。我相信我已经能够至少部分成功地注册该工具,因为在不同的 Visual Studio 项目中,我可以将“VsTools”(文件生成器类的命名空间)分配为 .txt 文件的“自定义工具” .txt 文件的属性对话框,然后,在运行该工具时,会生成一个不同的文件。但是,虽然我希望生成的文件显示一个数字(特别是应用自定义工具的文件中的行数),但生成的文件根本没有内容。
谁能帮助我了解我可能错误地注册了文件生成器或错误地实现了用于获取源文件行数的自定义逻辑?
IVsSingleFileGenerator 实现代码如下:
namespace VsTools
{
[Guid("A2...")]
public class ToolBase : IVsSingleFileGenerator
{
public int DefaultExtension(out string InputfileRqExtension)
{
InputfileRqExtension = ".txt";
return VSConstants.S_OK;
}
public int Generate(
string inputFilePath,
string inputFileContents,
string defaultNamespace,
IntPtr[] outputFileContents,
out uint outputByteCount,
IVsGeneratorProgress generateProgress)
{
int lineCount = inputFileContents.Split('\n').Length;
byte[] bytes = Encoding.UTF8.GetBytes(lineCount.ToString());
int length = bytes.Length;
outputFileContents[0] = Marshal.AllocCoTaskMem(length);
Marshal.Copy(bytes, 0, outputFileContents[0], length);
outputByteCount = (uint)length;
return VSConstants.S_OK;
}
}
}
用于注册“VsTools.ToolBase”文件生成器的注册表文件:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio\14.0_Config\CLSID\{A2..}]
"InprocServer32"="C:\\Windows\\System32\\mscoree.dll"
"ThreadingModel"="Both"
"Class"="VsTools2.ToolBase"
"Assembly"="VsTools, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e9b..."
"CodeBase"=file:///C:\\VsTools\\VsTools.dll
[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0_Config\Generators\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\VsTools]
"CLSID"="{A2..}"
"GeneratesDesignTimeSource"=dword:00000001
运行了以下命令:
regasm /codebase "C:\VsTools\VsTools.dll"
gacutil /i "C:\VsTools\VsTools.dll"