混合モードアセンブリの署名で管理されていないタイプを使用したエクスポート方法
-
28-10-2019 - |
質問
で構築されたミックスモードアセンブリがあります /clr
オプション。私は、クラスをエクスポートしようとしています。別の混合モードアセンブリによる消費のために、 /clr
オプション。
私の問題は、メソッドの署名には、管理されていないタイプと管理されていないタイプの混合物が含まれていることです。例えば:
static System::String ^Convert( const CString from );
最初は使用しようとしました __declspec(dllexport)
これを実装する非REFクラスで。これはエラーで失敗しました c3395:__declspec(dllexport)は、__clrcall呼び出しコンベンションで関数に適用できません, 、おそらく、署名の管理されたタイプのためです。私の次のテイクは、クラスAを作ることでした ref
代わりにクラス。アセンブリが構築され、リフレクターがエクスポートされた方法を次のように表示します。
public static unsafe string Convert(CStringT<wchar_t,ATL::StrTraitATL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > modopt(IsConst) modreq(IsCopyConstructed)* from);
ただし、クライアントアセンブリでは、エクスポートされた方法を参照できませんでした...
CString atlString("test");
AtlCStringConverter::Convert( atlString );
...エラーが生成されます C2039: 'Convert': 'xxx :: atlcstringConverter'のメンバーではありません. 。私は、署名が一致しない可能性のあるさまざまなチャータイプを混合するなどの明らかな間違いをチェックしました。
これらのエクスポートの試みのどちらも、マネージド/マネージドタイプの混合が署名で並んで露出しているという点で本当にコーシャではないことを理解していますが、マネージド/マネージドのこの混合は問題ありません 内部 ミックスモードアセンブリ、私は混合モードDLL間の署名のこのタイプの混合物を使用してタイプをエクスポートする方法がないのではないかと思っていましたか?
解決
この質問と答えは役立つかもしれません:コンパイラエラーC2158のための最良の回避策:make_publicはネイティブテンプレートタイプをサポートしていません