我尝试按照在线教程学习如何创建和注册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"