既存の VS2008 ベースの C++/CLI プロジェクト (具体的には CefSharp) を VS2012 にアップグレードしていますが、その間にいくつかの課題に直面しています。コンパイルで VS2008 に依存することを避けるために、.NET Framework 4.0 を対象とするようにプロジェクトをアップグレードしました。
すべて問題なく、プロジェクトは正しくコンパイルされますが、実行して WebView インスタンスを作成しようとすると、次の TypeLoadException が発生します。
アセンブリ 'CefSharp.Wpf、Version=1.25.0.35385、Culture=neutral、PublicKeyToken=null' のタイプ 'CefSharp.Wpf.WebView' のメソッド 'SetCursor' には実装がありません。":"CefSharp.Wpf.WebView"
明らかに、私は WebView.h と WebView.cpp の両方をかなり詳しく調べました。それらの内容は(関連部分)です:
public ref class WebView sealed : public ContentControl, IRenderWebBrowser
{
public:
virtual void SetCursor(CefCursorHandle cursor);
}
そして実装:
void WebView::SetCursor(CefCursorHandle cursor)
{
SafeFileHandle^ handle = gcnew SafeFileHandle((IntPtr)cursor, false);
Dispatcher->BeginInvoke(DispatcherPriority::Render,
gcnew Action<SafeFileHandle^>(this, &WebView::SetCursor), handle);
}
CefCursorHandle は次のように定義されます。
#define CefCursorHandle cef_cursor_handle_t
...そして cef_cursor_handle_t は次のように定義されます:
#define cef_cursor_handle_t HCURSOR
つまり、windef.h 構造体です。
インターフェイス(IRenderWebBrowser)ところで。このようにメソッドを定義します。
public interface class IRenderWebBrowser : IWebBrowser
{
public:
void SetCursor(CefCursorHandle cursor);
}
ある時点で、この問題は「const」と「non-const」の問題に関連していると思いましたが、例に見られるように、関連する const 指定子はありません。:-(
ここで見逃している明らかな落とし穴は何ですか? この投稿をざっと読みましたが、実際には役に立ちませんでした。
また、アセンブリの複数の/古いバージョンがどこかにぶら下がっている可能性についても考えたので、正しいバージョンがロードされていることを確認するためにアセンブリバージョンをバンプしようとしました-それはそうでした. また、アセンブリで ILSpy を調べたところ、メソッドは確実に存在します。ただし、そのメソッド シグネチャは次のとおりです。
public unsafe void SetCursor(HICON__* cursor)
安全でない部分、またはそのパラメーター (HICON__*) が C#/CLR コンテキストからアクセスできないという事実に関連している可能性がありますか? (私は C# アセンブリから型をインスタンス化しようとしています。) C++/CLI はまだ私の専門分野ではないことを認めなければなりません... :-)
誰?
(誰かが詳細を詳しく調べたい場合は、https://github.com/perlun/CefSharp/で自由にプロジェクトを複製/調査してください。これは vs2012 ブランチにあります。)