オプションで構築された混合モードのアセンブリがあり/clr
ます。オプションで構築された別の混合モードアセンブリで使用するために、そこからクラスをエクスポートしようとしてい/clr
ます。
私の問題は、メソッドのシグネチャにマネージド型とアンマネージド型が混在していることです。例えば:
static System::String ^Convert( const CString from );
最初は、これを__declspec(dllexport)
実装する非参照クラスで使用しようとしました。これはエラーC3395: __declspec(dllexport) cannot be applied to a function with the __clrcall Calling Convention で失敗しました。これはおそらく、署名のマネージド型が原因です。私の次の試みは、ref
代わりにクラスをクラスにすることでした。アセンブリがビルドされ、Reflector はエクスポートされたメソッドを次のように表示します。
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' : is not a member of 'XXX::AtlCStringConverter' が生成されます。署名が一致しない原因となる可能性のある異なる char タイプの混合などの明らかな間違いをチェックしました。
これらのエクスポートの試みはどちらも、マネージド型とアンマネージド型の混合が署名で並んで公開されているという点で、実際にはコーシャではないことを認識していますが、このマネージド型とアンマネージド型の混合は混合モード アセンブリ内では問題ないため、混合モードの DLL 間のシグネチャでこのタイプの混合を使用してタイプをエクスポートする方法はありませんか?