我们有一个用C++编写的混合模式DLL,它封装本机C++DLL并公开托管类。在公开的托管类中,我们使用Vector3D等类型的方法参数,它们是PresentationCore.DLL的一部分
因此,混合模式C++代码需要引用PresentationCore.DLL。我们通过来实现这一点
#using <PresentationCore.dll>
这需要项目的搜索路径包括PresentationCore.dll所在的文件夹。
这很糟糕,因为这些文件夹在不同的机器上会有所不同,而且我们的项目需要在几台机器上进行编译而不进行更改。目前,我们已经通过在代码库中包含PresentationCore.dll的副本来解决这个问题,这显然不是一个好的解决方案。
我非常感谢您提出的建议,我们可以绕过指定一个DLL的显式路径,该路径应该可以通过GAC完全访问。
不要执行#using <PresentationCore.dll>
。您需要右键单击项目,转到References...
,单击Add New Reference...
,然后从.Net
选项卡中选择PresentationCore
http://msdn.microsoft.com/en-us/library/aa970266.aspx
Phew我让它工作起来了。我有一个本地项目,我也有同样的问题,我需要使用PresentationCore中的HwndSource来对hwnds进行一些分析。我所做的是将我的项目保留为本机(无/clr开关),然后对于具有使用HwndSource的函数的源文件,我添加了/clr切换,这样我就可以包含其他源的设置,如异常处理等。
#using <System.dll>
#using <WindowsBase.dll>
#using <PresentationFramework.dll>
#using <PresentationCore.dll>
#using <UIAutomationProvider.dll>
#using <UIAutomationTypes.dll>
这工作得很好,你将不会得到任何Intellisense支持。输出中的一些警告,如果你能接受的话,这是给你的。
GAC位于%windir%\Assembly\子目录GAC_32或GAC_64 中
在这种情况下,我会使用象征性的链接。在本地目录中创建指向DLL的链接。然后从该链接进行编译。
是的,你必须为每台机器更换它。但你所要做的只是一行批处理脚本
考虑一下这个在我的机器上运行。
C:temp>for /f "tokens=*" %f in ('dir windowsassemblypresentationcore.dll /s/b') do @echo %f
C:windowsassemblyGAC_32PresentationCore3.0.0.0__31bf3856ad364e35PresentationCore.dll
C:windowsassemblyGAC_64PresentationCore3.0.0.0__31bf3856ad364e35PresentationCore.dll
选择你需要的一个(比如GAC_64),并设置一个链接到它——这就是你应该需要的。
@for /f "tokens=*" %f in ('dir windowsassemblypresentationcore.dll /s/b') do @echo %f | @findstr GAC_64 | mklink .presentationCore.dll "%f"