10

1つはC#とWCFを使用し、もう1つはC++とWWSAPIを使用して2つのプロセスを作成しています。2つの間の通信に使用されるアドレスを1つの場所で定義し、C#とC++の両方で使用できるようにしたいと考えています。これは可能ですか?

最も近いのは、IDLで定数を定義し、MIDLとTLBIMPを使用して、C#で使用できるDLLに定数を取り込むことです。しかし、これは定数を公開していないようです、または少なくとも私はそれをそうする方法を理解することができません。多分それは型定義だけに制限されています。

他に何か提案はありますか?

4

5 に答える 5

7

別のC++/ CLIプロジェクトを作成し、ファイル内のすべての定数を定義.hできます。たとえば、「ConstantBridge」というC ++ / CLIクラスライブラリプロジェクトと「CSharpProgram」というC#プロジェクトを作成します。

Constants.h

namespace Constants
{
    const int MAGIC_NUMBER = 42;
}

// String literals must be defined as macros
#define MAGIC_PHRASE "Hello World"

// Since stirngs must be macros it's arguably more consistent 
// to use `define` throughout. This is for demonstration purpose.

ConstantBridge.h

#include "Constants.h"

namespace ConstantBridge { public ref class ConstantBridge {
public:
    // The use of the `literal` keyword is important
    // `static const` will not work
    literal int kMagicNumber = Constants::MAGIC_NUMBER;
    literal String ^ kMagicPhrase = MAGIC_PHRASE;
};}

CSharpProgram.cs

Console.WriteLine(ConstantBridge.kMagicNumber); // "42"
Console.WriteLine(ConstantBridge.kMagicPhrase); // "Hello World"

ここで、「CSharpProgram」プロジェクトに「ConstantBridge」プロジェクトを参照させます。他のネイティブC++プロジェクトは単純にできます#include "Constants.h"

プロジェクトからsのみ を参照している限り、実行時の依存関係は生成されません。ILSpyまたはILdasmを使用して確認できます。C#およびC ++ / CLIでは、コンパイル時に「文字通り」呼び出しサイトにコピーされます。literalConstantBridgeconstliteral

于 2011-05-24T07:59:37.703 に答える
6

C#とC ++では、定数のモデルが異なります。通常、定数は結果のC ++バイナリでは出力されません。ほとんどの場合、必要な場所で自動的に置き換えられます。

定数を使用するのではなく、定数を返す関数を作成します。これは、C#からP/Invokeできます。

したがって、

#include <iostream>
const double ACCELERATION_DUE_TO_GRAVITY = 9.8;
int main()
{
     std::cout << "Acceleration due to gravity is: " << 
         ACCELERATION_DUE_TO_GRAVITY;
}

になります

#include <iostream>
extern "C" double AccelerationDueToGravity()
{
    return 9.8;
}
int main()
{
     std::cout << "Acceleration due to gravity is: " << 
         AccelerationDueToGravity();
}

これは、C#からP/Invokeできるはずです。

于 2010-06-30T02:08:31.560 に答える
5

私のユースケースの他のソリューションに満足していなかったので、元の要求によりよく適合するように見える少しハッキーなソリューションをコーディングしました。C#プロジェクトとC++プロジェクトの両方に組み込むことができる1つのファイル内の定数...

  1. 共通の場所にある.csファイルのバージョン情報。

このような:

// Version.cs
public static class MyAppVersion
{
    //build
    public static string Number = "1.0";
    public static string Phase = "Alpha";

    //configuration (these are the build constants I use, substitute your own)
#if BUILD_SHIPPING
    public static string Configuration = "Shipping";
#elif BUILD_DEVELOPMENT
    public static string Configuration = "Development";
#elif BUILD_DEBUG
    public static string Configuration = "Debug";
#else
    "build type not defined"
#endif
}
  1. [既存のアイテムを追加]を使用してC#プロジェクトに含める...[リンクとして追加]
  2. C ++プロジェクトに(.cppファイルで)インクルードします。#include

このような:

//include version information into a .cpp
#define class namespace
#define public
#define static
#define string const char*
#include "..\..\Version.cs" //or to where-ever your file is
;
#undef class
#undef public
#undef static
#undef string
  1. C#での参照:MyAppVersion.Number
  2. C ++での参照:MyAppVersion::Number
于 2017-01-25T17:19:40.560 に答える
1

過去にそのようなことをしなければならなかったとき、私はビルドプロセスに追加のプリコンパイルステップを追加しただけで、あるファイルを別のファイルから自動的に作成します。

定数はおそらくC#のクラス内にあるため、ソースファイルとして使用できます。

MyClass.cs:
    class MyClass {
        public const int NUM_MONTHS = 12;    //COMMON
        public const int YEAR_BASE = 1900;   //COMMON
    }

grep '//COMMON' MyClass.cs
    | sed -e 's/^ *public const [a-z][a-z]*/#define/'
          -e 's/ *= */ /'
          -e 's/;.*$//'
    >MyClass.h
grep '//COMMON' MyClass.cs | sed -e 's/ *public //' -e 's/;.*$/;/' >MyClass.hpp

これはあなたに与えるでしょう:

MyClass.h:
    #define NUM_MONTHS 12
    #define YEAR_BASE 1900

MyClass.hpp:
    const int NUM_MONTHS = 12;
    const int YEAR_BASE = 1900;

さて、Visual Studioにそのステップを実行させることは、私が行う方法を知っていることではありません。それが可能かどうかを調査する必要があります。UNIXyのテキスト処理ツールは本当にダウンロードする価値があります。私はいくつかのボックスにCygWinをインストールしていますが、これをローカライズしたものについては、個々のGnuWin32パッケージを使用することができます。

PowerShellでも同様の作業を行うことができますが、私はそれに精通していません。


さて、それはちょっとした悩みの種ですので、あなたの特定の質問に対しておそらくより良い方法を提案することができます。定数は一切使用しないでください。アドレスを構成ファイルに入れ、起動時にC#およびC++コードに読み取らせます。

そうすれば、簡単に値を共有でき将来変更したい場合に備えて構成できます。

于 2010-06-30T02:29:48.713 に答える
0

各定数のメソッドのより簡単な代替手段は、インスタンスプロパティとして定数を含むクラスです。これをC#で作成し、COMインターフェイスを介してC++に公開できます。すべての型と名前を正しく取得することを心配する必要がないため、P / Invokeよりも簡単でエラーが発生しにくくなります。これは、すべてコンパイラーによって行われます。

注:私はこれを試していません。動作するはずだと推測しているだけです。

于 2010-06-30T02:14:27.527 に答える