实例化VisualStudio.VCProjectEngine.10.0及更高版本神秘失败,8.0没有

时间:2013-12-31 06:34:49

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

注意:这个问题最初是关于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})不匹配:

CLSID for VisualStudio.VCProjectEngine.10.0 in the registry

但是,即使将VisualStudio.VCProjectEngine.10.0的元组调整为('{4547a58d-fc1c-4502-84fa-0163ee766635}', 0, 10, 0)也无法解决此问题。


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

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)

1 个答案:

答案 0 :(得分:1)

TL; WR(长时间不读)

要点是,微软已经悄悄改变了自动化界面VisualStudio.VCProjectEngine的语义,从Visual Studio 2010开始,在官方文档中几乎没有提到这一事实。相反,开发人员似乎需要收集花絮MSFT员工离开MS Connect和论坛页面并以有意义的方式连接它们。


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

该评论如下:

  

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

不幸的是,微软似乎已经决定使用旧接口创建一个新项目是不合法的,即改变接口的语义。

这篇文章试图收集和连接可用的信息 - 并且在官方文档中可以使用而不是

为了增加对伤害的侮辱,对此文档的描述最终只是在所述界面的文档底部中。

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

  

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

这个重要信息如何没有成为官方文档,这很“有趣”。因此,根据上述链接,我们得到的只是对VS 2010之前存在的基础知识的解释,暗示只有在引用的MS Connect案例中才提及API。

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

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

引用后者的相关部分:

  

原因

     

关于找不到路径的错误与路径无关   实际上,到.vcxproj文件。这个错误代码从一个冒出来的   内部尝试查找下的ProjectComponents文件夹   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}已解析为密钥Microsoft.VisualStudio.Project.VisualC.VCProjectEngine.VCProjectEngineShim下的名称HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{4547a58d-fc1c-4502-84fa-0163ee766635}。所以我猜实际的东西被一个不能很好地完成工作的垫片所取代。