用于代码生成的 Visual Studio 自定义工具...如何找出问题所在?

Posted

技术标签:

【中文标题】用于代码生成的 Visual Studio 自定义工具...如何找出问题所在?【英文标题】:Visual Studio custom tool for code generation... how do I find out what's going wrong? 【发布时间】:2011-12-11 09:17:16 【问题描述】:

我正在尝试在 Visual Studio 2010 中创建用于代码生成的自定义工具。首先我注册它:

"$(FrameworkSDKDir)Bin\NETFX 4.0 Tools\gacutil.exe" /if "$(TargetPath)"

然后我通过注册键添加它:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\CLSID\6A96476E-74F3-4AB3-9CCA-F15EC6104D84]
"RuntimeVersion"="v4.0.30319"
"Class"="MapBuildTool.MapFileGenerator"
"Assembly"="MapBuildTool, Version=1.0.0.0, Culture=en-US, PublicKeyToken=7d8abca94a1e38ae"
"ThreadingModel"="Both"
"InprocServer32"="C:\\Windows\\SysWOW64\\mscoree.dll"
@="MapBuildTool"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Generators\FAE04EC1-301F-11D3-BF4B-00C04F79EFBC\MapBuildTool]
"CLSID"="6A96476E-74F3-4AB3-9CCA-F15EC6104D84"
"GeneratesDesignTimeSource"=dword:00000001
@="MapBuildTool"

然后视觉工作室说:

Cannot find custom tool 'MapBuildTool' on this system.

好的……现在呢?它没有找到自定义工具注册表项吗?它是否找到了密钥但在加载程序集时遇到了问题?它是否加载了程序集但在实例化类时遇到了问题......?我可以查看哪些日志/位置以找出问题所在?

【问题讨论】:

【参考方案1】:

我使用昨天编写的自定义工具遇到了这个问题。非常令人沮丧。 reg 文件是正确的,自定义工具在 Experimental Hive 中完美运行。但它只是拒绝在常规 VisualStudio 中运行。

我猜 VisualStudio 会读取注册表,然后在某处缓存注册表。

执行以下似乎会重置此缓存

devenv /setup

执行此操作后,我的自定义工具完美运行。

【讨论】:

我遇到了完全相同的问题。尝试删除注册表项等。没有任何效果 - 我只是不断收到“找不到自定义工具”错误。关闭 Visual Studio,从提升的命令提示符运行此命令,等待它完成(几分钟)然后再次运行 VS2012,自定义工具正常工作。【参考方案2】:

调试:

运行 Process Monitor 对 VS2010/COM/.NET/Fusion 程序集加载噩梦进行逆向工程,查看您的 VS 选择了哪些注册表项,以及它尝试查找但失败并显示 NOTFOUND 的注册表项。

希望无需调试即可修复:

选项 1:

添加绑定路径:

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\BindingPaths\<A new GUID>]
"<Path the the folder containing your DLL>"=""

选项 2:

对此我不确定,但我认为您可以创建一个合适的 VS2010 包 (instructions),它会负责注册可执行文件的位置。

对于这两个选项,gacutil、tlbexp 和 regasm 都不是必需的。 VS2010 在查找 DLL 时会做自己的事情。

【讨论】:

我这样做了,然后必须运行下一个答案中显示的 commamdn devenv /setup @Michael,我认为您的意思是 harley.333 的答案。哪个答案是“下一个”可能会随着时间的推移而改变,因为答案会因被投票而改变。【参考方案3】:

也许为时已晚,但是:Writing a custom tool in VS.NET 您可能跳过了以下步骤之一:

注册您的生成器以进行 COM 互操作

您必须生成一个 GUID 并使用 tlbexp.exe 和 regasm.exe。 我假设您必须使用这些工具,而不是将生成器放入 GAC。

【讨论】:

以上是关于用于代码生成的 Visual Studio 自定义工具...如何找出问题所在?的主要内容,如果未能解决你的问题,请参考以下文章

求助visual studio2013怎么设置参考线,以及怎么自定义代码配色

参数如何传递到 Visual Studio 的自定义构建工具中?

Visual Studio Shell - 创建自定义 IDE

在 Visual Studio Code 中自定义语法突出显示

使用Visual Studio Code自定义代码模版

依赖项更改时 Visual Studio 运行自定义构建工具