악몽 COM 상호 운용성이 무엇인지 입증하고 있습니다. WPF 창을 포함하는 단순 관리 DLL이 있습니다. 결국이 창을 시작하는 간단한 ViewController 클래스가 있지만 지금은 아무것도 수행하지 않는 빈 메서드가 있습니다.관리되는 DLL을 호출 할 때 COM Interop에서 EEMessageException을 throw하는 중
COM interop에 대해 등록 된 인터페이스를 제공하는 관리되는 DLL의 관리되는 래퍼를 만들었습니다. 내 관리되는 래퍼를 호출 할 수 있습니다. 내 관리되는 래퍼 DLL의 진입 점에 MessageBox를 표시 할 수 있습니다. 그러나 랩핑 오전 DLL에서이 ViewController 클래스에 어떤 메서드를 호출하려고하면이 얻을 :
MfcVSApp1.exe 0x7c812aeb (kernel32.dll) 첫 번째 예외 : Microsoft C++ 예외 : EEMessageException at 메모리 위치 0x0012cb30 ..
어제 모두 작동했습니다. 이제 몇 가지 코드 :
내 래퍼 엔티티 :
public class EphemerisViewController
{
public EphemerisViewController()
{
}
public void GetString()
{
MessageBox.Show("me");
}
}
이 DLL은 또한 등록 된 :
[Guid("83C799E0-9808-40c2-A1AB-80BCB77A3B18")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[ComVisible(true)]
public interface IMaryln
{
void GetEphemeris(DateTime date, double latitude, double longitude);
/// <summary>
///
/// </summary>
/// <param name="date"></param>
/// <param name="latitude"></param>
/// <param name="longitude"></param>
void GetEphemeris1(Int64 millSecsSince1970, double latitude, double longitude);
}
[Guid("144DB386-D8EF-41a8-B9B1-57EE8A64600C")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ManagedProxy.Maryln")]
[ComVisible(true)]
public class Maryln : IMaryln
{
#region IMaryln Members
public Maryln()
{
System.Diagnostics.Debugger.Launch();
}
public void GetEphemeris(DateTime date, double latitude, double longitude)
{
//new EphemerisViewController().GetEphemeris(date, latitude, longitude);
}
public void GetEphemeris1(Int64 nanoSecsSince1970, double latitude, double longitude)
{
// This method does not throw. However, it will not be executed
// if any method in EphemerisViewController is called.
MessageBox.Show("Called from c++" + nanoSecsSince1970.ToString());
try
{
//new Maryln().Test(); // this will not throw
new EphemerisViewController().GetString(); // this will
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
public void Test()
{
MessageBox.Show("maryln test");
}
#endregion
}
관리되는 DLL은 관리되는 래퍼 DLL에 의해 참조, UserControl이이의 ViewController를 포함 COM interop하지만 문제를 해결하지 못하면이 옵션의 선택을 취소했습니다. 구루 (Gurus) 선생님, 여기서 도움이 필요합니다. 이것은 이미 2 일의 근무일을 소비했으며 시작한 곳에서 3 걸음을 뒤로했습니다. 어제 모두 작동했습니다.
추가
다음과 같이 네이티브 클라이언트 내 래퍼를 소모 : 또한, 청소와 재건 한 솔루션을 여러 번하지만 행운
void CMfcVSApp1Doc::LaunchEphemrisDialog()
{
HRESULT hr;
CoInitialize(NULL);
try
{
ManagedProxy::IMarylnPtr maryln(__uuidof(ManagedProxy::Maryln));
LONG64 time = 1309897499216000000;
hr = maryln->GetEphemeris1(time, 0, 0);
}
catch(...)
{
}
}
.