【问题标题】:Instantiating VisualStudio.VCProjectEngine.10.0 and later fails mysteriously, 8.0 doesn't实例化 VisualStudio.VCProjectEngine.10.0 及更高版本神秘地失败,8.0 没有
【发布时间】:2014-01-18 03:08:34
【问题描述】:

注意:问题最初是关于 Python 和 win32com,但事实证明问题存在于 COM 服务器中,而不是客户端。因此,问题和答案中的信息适用于所有可用作 COM 客户端的语言。

也许有人可以帮忙。我面临的是以下情况。我可以用我的代码实例化VisualStudio.VCProjectEngine.8.0。相关代码:

import win32com
vcver = {
         'VisualStudio.VCProjectEngine.8.0' : ('{FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}', 0, 8, 0),
         'VisualStudio.VCProjectEngine.10.0' : ('{0CD36BB6-D828-4DB9-91BF-AD493EE76B79}', 0, 10, 0),
         }
for ProgID, vc in vcver.iteritems():
    # Error also happens without the following line
    win32com.client.gencache.EnsureModule(vc[0], vc[1], vc[2], vc[3])
    o = win32com.client.gencache.GetClassForProgID(ProgID)()
    if o:
        try:
            # The following line causes the exception ...
            o.CreateProject('test')
            print "Success for %s" % ProgID
        except Exception as e:
            print str(e)
            raise

...给出这个错误:

Success for VisualStudio.VCProjectEngine.8.0
(-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Traceback (most recent call last):
  File "D:\scriptname.py", line 123, in <module>
    o.CreateProject('test')
  File "C:\Users\Username\AppData\Local\Temp\gen_py\2.7\0CD36BB6-D828-4DB9-91BF-AD493EE76B79x0x10x0.py", line 2756, in CreateProject
    ret = self._oleobj_.InvokeTypes(213, LCID, 1, (9, 0), ((8, 1),),projectName
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)

如您所见,一个工作正常,另一个神秘地失败了。什么给了?


这是makepy.py -i 提供的内容:

>makepy.py -i VisualStudio.VCProjectEngine.8.0
VCProjectEngineLibrary
 {FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}, lcid=0, major=8, minor=0
 >>> # Use these commands in Python code to auto generate .py support
 >>> from win32com.client import gencache
 >>> gencache.EnsureModule('{FBBF3C60-2428-11D7-8BF6-00B0D03DAA06}', 0, 8, 0)

>makepy.py -i VisualStudio.VCProjectEngine.10.0
VCProjectEngineLibrary
 {0CD36BB6-D828-4DB9-91BF-AD493EE76B79}, lcid=0, major=10, minor=0
 >>> # Use these commands in Python code to auto generate .py support
 >>> from win32com.client import gencache
 >>> gencache.EnsureModule('{0CD36BB6-D828-4DB9-91BF-AD493EE76B79}', 0, 10, 0)

注意:我刚刚注意到 makepy.py -i 给出的 CLSID 匹配 VisualStudio.VCProjectEngine.8.0,但不匹配 VisualStudio.VCProjectEngine.10.0(注册表显示 {4547a58d-fc1c-4502-84fa-0163ee766635}):

但是,即使将 VisualStudio.VCProjectEngine.10.0 的元组调整为 ('{4547a58d-fc1c-4502-84fa-0163ee766635}', 0, 10, 0) 也无济于事。


该错误似乎与 Visual Studio 2010 及更高版本有关。我还尝试使用makepy.py -i 给出的值将VisualStudio.VCProjectEngine.11.0VisualStudio.VCProjectEngine.12.0 作为ProgID,但错误相似:

Error for VisualStudio.VCProjectEngine.11.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Error for VisualStudio.VCProjectEngine.10.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u"Could not find a part of the path 'C:\\Python27\\ProjectComponents'.", None, 0, -2147024893), None)
Error for VisualStudio.VCProjectEngine.12.0: (-2147352567, 'Exception occurred.', (0, u'mscorlib', u'One or more errors occurred.', None, 0, -2146233088), None)

【问题讨论】:

  • pywintypes.com_error 消息说Could not find a part of the path 'C:\\Python27\\ProjectComponents' -- 你调查过吗?标准安装的 Python 没有创建 ProjectComponents 子目录。

标签: python visual-studio-2010 python-2.7 com pythoncom


【解决方案1】:

TL;WR(太长不会读)

要点是微软从 Visual Studio 2010 开始悄悄地改变了自动化接口VisualStudio.VCProjectEngine 的语义,并且在官方文档中几乎没有提及这一事实。相反,似乎希望开发人员收集 MSFT 员工在 MS Connect 和论坛页面上留下的花絮,并以有意义的方式将它们联系起来。


哇,所以微软决定改变VCProjectEngine 的语义。比较:

备注如下:

您不能实例化独立的VCProjectEngine 对象,因为必须在包含应用程序的文件夹中部署其他二进制文件。而是从已在 Visual Studio 中打开的项目中获取 VCProjectEngine 对象。

不幸的是,微软似乎认为使用旧接口创建一个新项目是不合法的,即更改接口的语义。

这篇文章试图收集和连接可用的信息 - 这些信息在官方文档中没有

而且雪上加霜的是,关于此的文档最终会出现在该接口文档的底部底部的微不足道的评论中。

如果您想要更好的解释……或者更确切地说是花絮……请进行网络搜索。也许你能想出比我发现的更好的东西。我想出的是这个声明here(强调我的):

自 Visual Studio 2010 起,不再支持此 API。 请参阅 此链接以获取有关如何以编程方式访问 项目: http://blogs.msdn.com/b/visualstudio/archive/2010/01/15/how-to-read-write-the-new-visual-c-project-properties.aspx

“有趣”的是,这些重要信息并未纳入官方文档。因此,按照上面的链接,我们得到的只是对 VS 2010 之前存在的基础知识的解释,暗示不支持 API 仅在引用的 MS Connect 案例中提到。

This MS Connect case 提到设置环境变量 (VisualStudioVersion=11.0),但不出所料,这也无济于事。也为各自的 Visual Studio 版本使用 VS201x 的开发人员命令提示符 也不会产生任何结果。又一个死胡同。

另一个 MS 论坛主题似乎也相关:Opening .vcxproj files in the VS2010 以及这个:VS 2010 C++ VCProjectEngine failure?

引用后者的相关部分:

原因

找不到路径的错误与路径无关 实际上,到 .vcxproj 文件。此错误代码从 内部尝试在 InstallPath(实际上是正在运行的可执行文件的路径)。

分辨率

我刚刚复制了构建我的测试应用程序的 Debug 文件夹下的 Microsoft Visual Studio 10.0\Common7\Tools\ProjectComponents 文件夹,它不再失败。再具体一点, 它正在寻找的文件夹来自一个组成的字符串(在 C# 中),比如 这个:

Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "ProjectComponents")

其中一位开发人员建议我可能“......还需要添加这个 目录到您的应用程序配置文件中的程序集探测路径。”但是 我能够让它运行简单的测试而不这样做。它 其他项目引擎操作可能需要。

漫长的旅程终于结束了?不是这样... 试图在 Visual Studio 安装中找到这个神秘的文件夹会产生......好吧,什么都没有。

C:\>for %i in (10.0 11.0 12.0) do dir "%ProgramFiles(x86)%\Microsoft Visual Studio %i\Common7\IDE\ProjectComponents"

...给出(剥离的冗余信息):

C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE
File Not Found
C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE
File Not Found
C:\>dir "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ProjectComponents"
 Directory of C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE
File Not Found

因此,所谓的解决方法所需的文件夹在(所有?)Visual Studio 安装中都不存在。


旁注:我发现的神秘 CLSID {4547a58d-fc1c-4502-84fa-0163ee766635} 解析为键 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{4547a58d-fc1c-4502-84fa-0163ee766635} 下的名称 Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectEngineShim。所以我猜实际的东西被一个不能很好地完成它的工作的垫片所取代。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多