任何依賴於c++/ CLI依賴於本機C dll的CPU(任何用於c++/ CLI的CPU)

[英]Any CPU dependent on C++/CLI dependent on native C dll (any cpu for c++/cli)


Here's my problem. I am wrapping a C dll in C#. To do this, I am first writing a C++/CLI wrapper. The native C library is linked to the C++/CLI wrapper. (Linker properties in C++/cli project).

這是我的問題。我正在用c#包裝一個cdll。為此,我首先編寫一個c++ /CLI包裝器。本機C庫鏈接到c++ /CLI包裝器。(c++ /cli項目中的鏈接器屬性)。

Here's how it is all organised now: - The native C .lib: both x86 and 64bit.

以下是它現在的組織方式:-本機C .lib: x86和64位。

  • 1 solution containing 2 projects:
    • C++/CLI wrapper project to which is linked native C .lib
    • C+ /CLI包裝器項目,鏈接到本機C .lib
    • C# project referencing C++/CLI project
    • c#項目引用c++ /CLI項目
  • 一個包含兩個項目的解決方案:c++ /CLI包裝項目,它鏈接到本機C .lib c#項目,引用c++ /CLI項目

My problem comes from the fact that I need C# to target "Any CPU". But this option is not available in C++/CLI since it compiles directly to native code.

我的問題來自這樣一個事實:我需要c#來鎖定“任何CPU”。但是這個選項在c++ /CLI中不可用,因為它直接編譯為本地代碼。

My idea to solve this is: - Compile C++/CLI wrapper in x86 and then change the config and compile to 64 bit. When it compiles, I would like to tell it which dll to take based on the platform. ie: if compiling in 64bit, link 64 bit native C dll, else if x86, link x86 native C. - With this done, I should then be able to have Any CPU target in my C# platform. Here again, instead of referencing my C++/CLI wrapper project, I would reference the required dll based on the target platform.

我解決這個問題的想法是:-在x86中編譯c++ /CLI包裝器,然后更改配置並編譯為64位。當它編譯時,我想告訴它基於平台要采用哪個dll。如果編譯在64位,鏈接64位本機C dll,如果x86,鏈接x86本機C -這樣做,我應該能夠在我的c#平台上有任何CPU目標。在這里,我將根據目標平台引用所需的dll,而不是引用我的c++ /CLI包裝器項目。

My questions are:

我的問題是:

  • How to I tell the C++/CLI project which .lib to link to based on the target platform?
  • 如何告訴c++ /CLI項目基於目標平台鏈接到哪個.lib ?
  • How to I tell the C# project which C++/CLI dll to reference based on the target platform?
  • 如何告訴c#項目在目標平台上要引用哪個c++ /CLI dll ?

Let me add that the C# project a CLASS LIBRARY to be used by an x86 or x64 client.

讓我添加c#項目一個類庫,供x86或x64客戶機使用。

I hope my question is clear enough. Any helps would be appreciated !

我希望我的問題足夠清楚。如有任何幫助,我們將不勝感激!

UPDATE based on:Conditional references in .NET project, possible to get rid of warning?...

基於:.NET項目中的條件引用,是否可以消除警告?

So now I've edited my .csproj file using a condition to reference the dll as follows:

現在我已經編輯了我的。csproj文件,使用一個條件引用dll:

<ItemGroup>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=AMD64"
               Condition="$(Platform) == 'x64'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\x64\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
    <Reference Include="AlibCppWrapper, Version=1.0.4303.21410, Culture=neutral, PublicKeyToken=c0c17a53adc44091, processorArchitecture=x86"
               Condition="$(Platform) == 'x86'">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\Debug\AlibCppWrapper.dll</HintPath>
    </Reference>
  </ItemGroup>

Unfortunately this doesn't work as the $(Platform) is set to AnyCPU...

不幸的是,這並不起作用,因為$(平台)被設置為任何cpu……

1 个解决方案

#1


22  

What you describe is known as "side-by-side assembly" (two versions of the same assembly, one 32 and the other 64 bit)... I think you will find these helpful:

您所描述的是“並行程序集”(同一程序集的兩個版本,一個32位,另一個64位)……我想你會發現這些有用的:

EDIT - as per comment:

編輯-根據評論:

Here you can find a walkthrough for exactly your scenario (.NET DLL wrapping C++/CLI DLL referencing a native DLL) http://scottbilas.com/blog/automatically-choose-32-or-64-bit-mixed-mode-dlls/

在這里,您可以找到一個完整的場景演練(。NET DLL包裝C++/CLI DLL引用一個本地DLL) http://scottbilas.com/blog/automatically-choos-32or -64位-混合模式-dlls/


注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:https://www.itdaan.com/blog/2011/10/11/7908c3b248941ffdc8ce9249acb9be85.html



 
粤ICP备14056181号  © 2014-2021 ITdaan.com