質問: new MainView(); の2つでエラーが発生することが分かりました。 DllExport ではなく C++/CLI で試しましたが、こちらでもダメでした。 (コードは残ってないです、すみません。) dll内をデバッグ出来るようにしたかったのですが、今の所は出来ていません。 ### 補足情報(FW/ツールのバージョンなど) Visual Studio 2015
回答: すみません、自己解決しました。 **DllExport**を使用した方法は一旦止めて、**C++/CLI**で再度行いましたが、私の環境では使用できませんでした。(チーム内の環境を変える必要があったため) あまり詳しくは調べてないのですが、**COM**を使用した方法で解決出来ました。 特に参考にさせて頂いたサイトを貼っておきます。 コードは貼ってあるサイトを参考にしています。(どのように改良したか残してあります。活用してください。) ### 参考にさせて頂いたサイト https://archive.fo/SWmZa https://www.84kure.com/blog/2014/07/17/c-cからcのdllを呼ぶ方法/ ``` using GUI.ViewModels; using GUI.Views; using System.Diagnostics; namespace GUI { //++ C++側に見せる関数を記述するクラス public class Link { #region ウィンドウ生成 private GUI.App app = new GUI.App(); public void Create() { app.Run(); } public void Delete() { app.Shutdown(); } #endregion ウィンドウ生成 } } ``` ``` //!++ 追加 #pragma comment(lib, "comsupp.lib") #pragma comment(lib, "comsuppw.lib") #include #include #include //グローバル変数 IDispatch *pIDisp = NULL; IUnknown *pIUnk = NULL; //プロトタイプ宣言 int Init(void); long Finalize(void); //int Sum(int p_Number1, int p_Number2); void CreateGUIWindow(); int main() { //変数宣言 int l_Result = 0; //初期処理 Init(); //合計処理 //l_Result = Sum(5, 7); CreateGUIWindow(); //後処理 Finalize(); return 0; } //***************************************************************************// //初期化関数 //***************************************************************************// int Init(void) { CLSID clsid; //COM初期化 CoInitialize(0); HRESULT hr = S_OK; //ProcIDからCLSIDを取得 //! (ネームスペース名.クラス名) hr = CLSIDFromProgID(L"GUI.Link", &clsid); if (FAILED(hr)) { return -1; } //Instanceの生成 hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pIUnk); if (FAILED(hr)) { return -2; } //インターフェースの取得(pIDispは共通変数) hr = pIUnk->QueryInterface(IID_IDispatch, (void**)&pIDisp); if (FAILED(hr)) { return -3; } //正常終了 return 0; } //***************************************************************************// //後始末処理 //***************************************************************************// long Finalize(void) { pIDisp->Release(); pIUnk->Release(); CoUninitialize(); return 0; } //***************************************************************************// //合計処理呼出処理 //***************************************************************************// //int Sum(int num_1, int num_2) void CreateGUIWindow() { //DISPIDの取得(関数名の設定) DISPID dispid = 0; OLECHAR *Func_Name[] = { L"Create" };//? Create : 呼び出したい関数 HRESULT h_result = pIDisp->GetIDsOfNames(IID_NULL, Func_Name, 1, LOCALE_SYSTEM_DEFAULT, &dispid); if (FAILED(h_result)) { return; } //パラメータ作成 //! 引数の設定 DISPPARAMS parameter; memset(&parameter, 0, sizeof(DISPPARAMS)); parameter.cNamedArgs = 0; parameter.rgdispidNamedArgs = NULL; parameter.cArgs = 0; //! 呼び出す関数の引数の数 //+ 引数設定 詳しくは http://marupeke296.com/IKDADV_CPP_VARIANT.html //! 呼び出す引数分、配列を確保する //! (順番に注意...逆になる) //VARIANTARG* pVarg = new VARIANTARG[parameter.cArgs]; ////+ 後ろから1つ目の引数設定 ////? vt : 引数の型によって種類を変える必要がある ////? intVal : 引数がint型であるため //pVarg[0].vt = VT_I4; //pVarg[0].intVal = num_2; ////+ 後ろから2つ目の引数設定 //pVarg[1].vt = VT_I4; //pVarg[1].intVal = num_1; ////+ 設定した引数分の情報を格納する //parameter.rgvarg = pVarg; //! 関数の結果が入っている //VARIANT vResult; //VariantInit(&vResult); //呼び出し //!? nullptr : 元はvResultが入っていました pIDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &parameter, nullptr, NULL, NULL); //delete[] pVarg; //return vResult.intVal; } ```