我正在尝试在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.
好的......现在怎么样?它找不到自定义工具注册表项吗?它是否找到了钥匙,但装卸组件有困难?它是否加载了程序集但是在实例化类时遇到了麻烦......?我可以在哪些日志/地方找出错误的地方?
答案 0 :(得分:12)
我使用昨天写的自定义工具遇到了这个问题。非常令人沮丧。 reg文件是正确的,自定义工具在Experimental Hive中完美运行。但它只是拒绝在常规VisualStudio中运行。
我猜测VisualStudio会读取注册表,然后在某处缓存注册表中的内容。
执行以下操作似乎会重置此缓存
devenv /setup
执行此操作后,我的自定义工具运行良好。
答案 1 :(得分:6)
要调试:
运行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。在查找DLL时,VS2010会做自己的事情。
答案 2 :(得分:0)
也许为时已晚:Writing a custom tool in VS.NET
您可能跳过了以下步骤之一:
为COM互操作注册您的Generator
您必须生成GUID并使用tlbexp.exe和regasm.exe。 我假设您必须使用这些工具,而不是将生成器放入GAC。