我们有一个用C ++编写的混合模式DLL,它包装本机C ++ DLL并公开托管类。在公开的托管类中,我们使用Vector3D等类型的方法参数,它们是PresentationCore.DLL的一部分。
因此,混合模式C ++代码需要引用PresentationCore.DLL。我们通过
来做到这一点#using <PresentationCore.dll>
需要项目的搜索路径包含PresentationCore.dll所在的文件夹。
这很糟糕,因为这些文件夹在不同的机器上有所不同,我们的项目需要在几台机器上进行编译而无需更改。目前,我们已经通过在我们的代码库中包含一份PresentationCore.dll来解决这个问题,这显然不是一个好的解决方案。
我很感激建议我们如何绕过指定一个可以通过GAC完全访问的DLL的显式路径。
答案 0 :(得分:1)
不要#using <PresentationCore.dll>
。您需要右键点击该项目,转到References...
,点击Add New Reference...
,然后从PresentationCore
标签中选择.Net
。我得到了提示:
答案 1 :(得分:0)
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支持。输出中的一些警告,如果你可以忍受,那就适合你。
答案 2 :(得分:-1)
在%windir%\ Assembly \中找到GAC,然后是子目录GAC_32或GAC_64
在这种情况下,我会使用符号链接。在本地目录中创建DLL的链接。然后从该链接进行编译。
是的,您必须为每台机器更改它。但是你要做的就是用一行批处理脚本来完成它。
考虑在我的机器上运行。
C:\temp>for /f "tokens=*" %f in ('dir \windows\assembly\presentationcore.dll /s/b') do @echo %f
C:\windows\assembly\GAC_32\PresentationCore\3.0.0.0__31bf3856ad364e35\PresentationCore.dll
C:\windows\assembly\GAC_64\PresentationCore\3.0.0.0__31bf3856ad364e35\PresentationCore.dll
选择你需要的那个(比如说GAC_64)并设置一个链接 - 这就是你应该需要的。
@for /f "tokens=*" %f in ('dir \windows\assembly\presentationcore.dll /s/b') do @echo %f | @findstr GAC_64 | mklink .\presentationCore.dll "%f"