1

C ++/CLIで記述されたカスタム.Netインターフェイスがあります。

public interface class IBackgroundExtractor
{
};

私のC#アプリケーションでは、インターフェイスは次のユーザーによって使用されます。

private IBackgroundExtractor extractor = null;

上記のコードは、(Visual Studioをインストールした)私のコンピューターではスムーズに実行されますが、(Visual Studioをインストールせずに)別のコンピューターではクラッシュしました。

AppName: speedtest.exe   AppVer: 1.0.0.0     ModName: kernel32.dll
ModVer: 5.1.2600.5512    Offset: 00012aeb

null割り当てを削除すると、コードは両方のコンピューターで実行されます。

private IBackgroundExtractor extractor;

ただし、純粋なC#で別のインターフェイスを作成しました。インターフェイスをnullに設定しても、プログラムはクラッシュしません。

interface IAnotherInterface
{
}
private IAnotherInterface test = null;

C ++ / CLIインターフェイスの何が問題になっていますか?

[備考]

テスト用に2つの「クリーンな」新しいプロジェクトを作成しました。最初のプロジェクトはC++/ CLIクラスライブラリです([新しいプロジェクト]-> [Visual C ++]-> [CLR]-> [クラスライブラリ])。ライブラリの.hファイルに次の行を追加します。

public interface class ITest {
};

次に、Windowsフォームアプリケーションプロジェクトを作成し([ネットプロジェクト]-> [Visual C#]-> [Windows]-> [Windowsフォームアプリケーション])、メイン関数でITest変数を宣言します。

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());

    ITest xxx = null;
}

プログラムは開発用コンピューター(インストールされているVisual Studio)で実行されますが、他の2台のコンピューターではクラッシュします。クラッシュしたコンピューターの1つは物理マシンで、もう1つは仮想マシンです。

Windows XP Pro SP3、Visual Studio 2010、および.NetFramework4.0を使用しています。

4

2 に答える 2

1

正しいバージョンのMicrosoftVisualC ++ランタイムがターゲットマシンにインストールされていることを確認しましたか?(開発環境にはすでにこれがインストールされていますが、現在のバージョンのWindowsにはデフォルトでこのランタイムが含まれていません)。

「セーフ」モードを使用するようにC++/ CLIプロジェクトを設定した場合、Microsoft Visual c ++ランタイムはまったく参照されません(.NETのみ)。参考のためにこれを参照してください:純粋で検証可能なコード。ネイティブな作業を行う必要がある場合は、最新のVisualC++ランタイムをインストールする必要がある可能性が非常に高くなります。ここで再配布可能ファイルを取得できます:Microsoft Visual C++2010再配布可能パッケージ

これが問題であることを確認したい場合は、sxstraceツールを使用してこれらの問題を診断できます(役立つチュートリアル)。

于 2011-05-19T03:10:20.057 に答える
1

null割り当ては、おそらくエラーではなく、エラーのトリガーです。このnullへの割り当ては、おそらくC ++/CLIアセンブリにアクセスするコードの最初の行です。したがって、そのnull割り当てが実行される前に、C ++/CLIアセンブリのアンマネージ部分が初期化されます。それはおそらくエラーが発生している場所です。

于 2011-05-19T03:37:40.850 に答える