5

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

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

然后我通过 reg 键添加它:

[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.

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

4

3 回答 3

13

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

我猜 VisualStudio 会读取注册表,然后在某处缓存注册表的各个部分。

执行以下似乎重置此缓存

devenv /setup

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

于 2013-08-08T19:43:16.300 回答
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 包(指令),它将负责注册可执行文件的位置。

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

于 2012-02-27T17:42:55.553 回答
0

Perhaps too late but: Writing a custom tool in VS.NET
You might have skipped one of these steps:

Register your Generator for COM interop

You have to generate a GUID and use tlbexp.exe and regasm.exe. I assume you have to use these tools instead of putting the generator in the GAC.

于 2011-12-12T14:50:50.380 回答