我有一个托管C#项目(针对任何CPU),它引用了一个非托管C DLL . 我想将我的C#项目部署为任何CPU,但我的C DLL没有任何CPU选项 . 我的C DLL只能针对ARM,Win32和x64平台 . 为方便起见,我想将所有这些内容构建到与C#项目相同的目录中,让我的C#项目动态引用它们;我希望我的输出目录包含我的非托管DLL的ARM,Win32和x64版本 . 因此,我如何让我的解决方案为同一个项目构建多个平台目标?
我找到了我想要的解决方法 .
您需要做的第一件事是在项目文件上使用MSBuild,以便在另一个平台下构建DLL . 我的解决方案将我的项目构建为x64,因此我需要构建x86版本作为额外的构建后步骤,所以我所做的是为管理C#项目添加了一个构建后脚本以便于此过程:
del "$(TargetDir)Unmanaged_x64.dll" ren "$(TargetDir)Unmanaged.dll" Unmanaged_x64.dll del "$(TargetDir)Unmanaged_x86.dll" "C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" "$(SolutionDir)Unmanaged\Unmanaged.vcxproj" /p:Configuration=$(ConfigurationName) /p:Platform=x86 copy "$(SolutionDir)Unmanaged\$(ConfigurationName)\Unmanaged.dll" "$(TargetDir)Unmanaged_x86.dll"
现在,在我的C#应用程序中,我的 App.xaml.cs 文件中有一个程序集解析器:
App.xaml.cs
protected override void OnStartup(StartupEventArgs e) { ... AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; ... } Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) { if (args.Name == "Unmanaged, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null") { if (Environment.Is64BitOperatingSystem) { return Assembly.LoadFrom(String.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, "Unmanaged_x64.dll")); } else { return Assembly.LoadFrom(String.Format("{0}\\{1}", AppDomain.CurrentDomain.BaseDirectory, "Unmanaged_x86.dll")); } } return null; }
适合我的需求;可能需要调整你的!干杯,大家好 .
1 回答
我找到了我想要的解决方法 .
您需要做的第一件事是在项目文件上使用MSBuild,以便在另一个平台下构建DLL . 我的解决方案将我的项目构建为x64,因此我需要构建x86版本作为额外的构建后步骤,所以我所做的是为管理C#项目添加了一个构建后脚本以便于此过程:
现在,在我的C#应用程序中,我的
App.xaml.cs
文件中有一个程序集解析器:适合我的需求;可能需要调整你的!干杯,大家好 .