2013-05-01 1 views
0

기존의 VS2008 기반 C++/CLI 프로젝트 (특히 CefSharp)를 VS2012로 업그레이드하고 그 사이에 몇 가지 문제에 직면하고 있습니다. 컴파일을 위해 VS2008에 의존하지 않기 위해 .NET Framework 4.0을 대상으로 프로젝트를 업그레이드했습니다.가짜 TypeLoadException이 발생하는 이유 " 조립품에서 <baz> 구현이 없습니다"?

방법 '에서는 SetCursor'형태로 "CefSharp.Wpf.WebView '

모두 잘 프로젝트가 제대로 컴파일,하지만 난 그것을 실행하고 웹보기 인스턴스를 만들려고 할 때, 나는 다음과 같은 TypeLoadException이를 얻을 수 "CefSharp.Wpf, Version = 1.25.0.35385, Culture = neutral, PublicKeyToken = null '구현이 없습니다.": "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) btw. 이와 같은 방법을 정의합니다. 한 지점에서

public interface class IRenderWebBrowser : IWebBrowser 
{ 
public: 
    void SetCursor(CefCursorHandle cursor); 
} 

, 나는 문제가 예에서 볼 수 있듯이 "const가 아닌"문제가 있지만, 반군 CONST 지정자가없는 대 "CONST"에 관한 생각했다. :-(

내가 여기에 누락 명백한 잡았다는 무엇

? 나는 this post을 통해 미끄러 져하지만 정말 나에게 도움이되지 않았다.

가 나는 또한 매달려 어셈블리의 구/여러 버전의 가능성에 대해 생각 어딘가에서 어셈블리 버전을 부딪 치면서 올바른 버전이로드되었는지 확인했습니다. 어셈블리에서도 ILSpy를 사용하여이 메서드를 확인했습니다. 그러나 메서드 서명은

입니다.
public unsafe void SetCursor(HICON__* cursor) 

안전하지 않은 부분 또는 매개 변수 (HICON __ *)가 정확하지 않을 수 있습니다. C#/CLR 컨텍스트의 essible? (C# 어셈블리에서 유형을 인스턴스화하려고합니다.) C++/CLI가 실제로 내 전문 분야가 아니라는 것을 인정해야합니다. :-)

사람이 누구입니까?

(자세한 내용을 자세히보고 싶다면 https://github.com/perlun/CefSharp/에서 프로젝트를 복제/조사 할 수 있습니다.이 자료는 vs2012 분기에 있습니다.)

답변

0

다른 사람에게 도움이되기를 바랍니다 ... 내 생각이 겉으로는 옳았습니다. 형식이 이므로 관리되지 않는 (관리되는 영역에서는 액세스 할 수 없음)이기 때문에 C++ 컴파일러는 CefCursorHandle/HICON 구조체를 내부 CLR 구조체로 WebView가 선언 된 어셈블리 내에 만듭니다. 이것은 메소드를 본질적으로 uncallable하게 만든다. (내부 파라미터 => public 메서드는 C#에서 호출 할 수 없다.) 그리고 C#으로부터 타입을 시도 할 때 CLR이 이것에 대해 barf로 나타난다 ...

변경 매개 변수 유형을 IntPtr으로 설정하면 코드가 의도 한대로 작동합니다. "void *"도 옵션이며 C++ 측에서 사용하기가 더 쉬울 수도 있습니다.

(이 경우에는 메서드가 C#/관리 측면에 사용할 필요가 없으므로 IntPtr/void *를 사용하는 데 문제가되지 않습니다. 실제로 사용되는 경우 적절한 마샬링이 더 좋을 것입니다 아이디어보다.)

0

후속 조사 :)

public unsafe class Foo : IRenderWebBrowser 
{ 
    public void SetBuffer(int width, int height, void* buffer) 
    { 
     throw new NotImplementedException(); 
    } 

    // ...and so forth. 
} 

을 이제/안전하지 않은 플래그를 활성화 한 후 (이 컴파일 (무엇을로 나에게 더 많은 통찰력을 수 있습니다 : 난 그냥 실험, C 번호에 IRenderWebBrowser 인터페이스를 구현하려 "혼란"약간은 적어도 말을

HICON__는 C#을/관리 세계에 액세스 할 수없는 경우
1>Y:\git\ataranto.CefSharp\CefSharp.Wpf.Example\MainWindow.xaml.cs(167,31,167,38): error CS0122: 'HICON__' is inaccessible due to its protection level 
1>Y:\git\ataranto.CefSharp\CefSharp.Wpf.Example\MainWindow.xaml.cs(167,21,167,30): error CS0051: Inconsistent accessibility: parameter type 'HICON__*' is less accessible than method 'CefSharp.Wpf.Example.Foo.SetCursor(HICON__*)' 
1>Y:\git\ataranto.CefSharp\CefSharp.Wpf.Example\MainWindow.xaml.cs(182,45,182,52): error CS0122: 'CefRect' is inaccessible due to its protection level 
1>Y:\git\ataranto.CefSharp\CefSharp.Wpf.Example\MainWindow.xaml.cs(182,21,182,44): error CS0051: Inconsistent accessibility: parameter type 'CefRect*' is less accessible than method 'CefSharp.Wpf.Example.Foo.SetPopupSizeAndPosition(CefRect*)' 

, 이러한 방법은 유형에 존재한다는 사실은 CLR을 만드는 것이 확실히 할 수 있습니다)이 원인이 될 형식을 관리 컨텍스트에서 인스턴스화 할 수 없게 만듭니다. . 어떤 방법으로 C++/CLI에서 메소드가 public (문제의 인터페이스를 구현)이지만 "CLR에서 숨김"(어리석은 TypeLoadExceptions 등을 피하기 위해)이되도록 지정합니까?