我正在将现有的基于 VS2008 的 C++/CLI 项目(更具体地说,CefSharp)升级到 VS2012,同时面临一些挑战。为避免依赖 VS2008 进行编译,我已将项目升级为面向 .NET Framework 4.0。
一切都很好,项目编译正确,但是当我运行它并尝试创建一个 WebView 实例时,我得到以下 TypeLoadException:
来自程序集“CefSharp.Wpf,版本=1.25.0.35385,文化=中性,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 分支上。)