Visual Studio自定义工具用于代码生成...我如何找出出了什么问题?

5

我正在尝试在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"

然后 Visual Studio 显示:

Cannot find custom tool 'MapBuildTool' on this system.

好的...现在怎么办?它没有找到自定义工具注册表键吗?它找到了键但无法加载程序集吗?它加载了程序集但有问题实例化类...?我可以查看哪些日志/位置以查找问题?

3个回答

13

昨天我遇到了一个自定义工具的问题,非常令人沮丧。注册表文件是正确的,自定义工具在实验性Hive上运行得很完美。但是它在普通的VisualStudio中却无法运行。

我猜测VisualStudio会读取注册表,然后在某个地方缓存注册表的部分内容。

执行以下操作似乎可以重置此缓存:

devenv /setup

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


我也遇到了完全相同的问题。尝试删除注册表键等,但都无效 - 我一直收到“找不到自定义工具”的错误。关闭 Visual Studio,从高级命令提示符中运行此命令,等待它完成(几分钟),然后再次运行 VS2012,这样自定义工具就可以使用了。 - Barrie

6

调试方法:

运行进程监视器逆向工程VS2010/COM/.NET/Fusion程序集加载过程,查看您的VS选择的注册表项以及哪些注册表项由于找不到而失败。

可能的修复方法(无需进行调试):

选项1:

添加绑定路径:

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

选项2:

我不确定这一点,但我认为您可以创建一个合适的VS2010软件包(说明 ),它将负责注册可执行文件的位置。

无论选择哪个选项,都不需要使用gacutil、tlbexp或regasm。VS2010在查找DLL时会自行处理。


我完成了这个任务,然后需要运行下一个答案中显示的命令 devenv /setup。 - Michael Edwards
1
@Michael,我想你指的是harley.333的答案。由于回答因为被点赞而移动,哪个答案是“下一个”可能会随时间而变化。 - Edward Brey

0

或许已经晚了,但是:在VS.NET中编写自定义工具
你可能跳过了其中一个步骤:

为COM互操作注册你的生成器

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接