注意:这个问题最初是关于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及更高版本有关。我还尝试将VisualStudio.VCProjectEngine.11.0
和VisualStudio.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)
答案 0 :(得分:1)
要点是,微软已经悄悄改变了自动化界面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}
。所以我猜实际的东西被一个不能很好地完成工作的垫片所取代。