文字通りにも比喩的にも壁に頭をぶつけて一日を過ごした後、私は助けを求めます:
DLLとしてコンパイルされたアンマネージC++プロジェクトがあります。それをCPPプロジェクトと呼びましょう。現在、管理されていない環境で動作します。さらに、WPFプロジェクトと呼ばれるWPFプロジェクトを作成しました。このプロジェクトは単純で、現在ほとんど空のプロジェクトです。単一のウィンドウが含まれており、プロジェクト1のコードを使用する必要があります。そのために、相互運用プロジェクトと呼ばれ、DLLとしてコンパイルされるCLRC ++プロジェクトを作成しました。
簡単にするために、私が要約したいくつかの基本的なテストコードを基本に添付します。
CPPプロジェクトには、次の2つのテストファイルがあります。
tester.h
#pragma once
extern "C" class __declspec(dllexport) NativeTester
{
public:
void NativeTest();
};
tester.cpp
#include "tester.h"
void NativeTester::NativeTest()
{
int i = 0;
}
InteropProjectには次のファイルがあります。
InteropLib.h
#pragma once
#include <tester.h>
using namespace System;
namespace InteropLib {
public ref class InteropProject
{
public:
static void Test()
{
NativeTester nativeTester;
nativeTester.NativeTest();
}
};
}
最後に、WPFプロジェクトには、相互運用プロジェクトを参照する単一のウィンドウがあります。
MainWindow.xaml.cs
using System;
using System.Windows;
using InteropLib;
namespace AppGUI
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
InteropProject.Test();
}
}
}
また、XAML自体には空のウィンドウがあります(デフォルトで作成されます)。
WPFプロジェクトを実行しようとすると、次のエラーが発生します。
System.Windows.Markup.XamlParseException:'指定されたバインディング制約に一致するタイプ'AppGUI.MainWindow'でのコンストラクターの呼び出しにより、例外がスローされました。行番号「3」および行位置「9」。---> System.IO.FileNotFoundException:ファイルまたはアセンブリ'InteropLib.dll'またはその依存関係の1つを読み込めませんでした。指定されたモジュールが見つかりませんでした。
AppGUI.MainWindow..ctor()で
興味深いことに、CPPプロジェクトからクラスをエクスポートしない場合、このエラーは発生しません。たとえば、次のように変更tester.h
した場合:
#pragma once
class NativeTester
{
public:
void NativeTest()
{
int i = 0;
}
};
ただし、この場合、より複雑なクラスを使用することはできません。以前のように実装をcppファイルに移動すると、コードをエクスポートしないために未解決のリンケージエラーが発生します。実際に使用したいC++コードは大きく、多くのクラスがあり、オブジェクト指向であるため、すべての実装をhファイルに移動することはできません。
私が成功せずに解決しようとしてきたこの恐ろしいエラーを理解するのを手伝ってください。
ありがとう。