COM interop向我證明了什麼。我有一個簡單的託管DLL包含一個WPF窗口。我有一個簡單的ViewController類,最終會啓動這個窗口,但現在有一個空方法,什麼都不做。COM Interop在調用託管DLL時拋出EEMessageException
我已經爲這個託管DLL創建了一個託管包裝器,它公開了一個爲COM託管註冊的接口。我可以調用我的託管包裝確定。我可以在我的託管包裝器DLL的入口點顯示一個MessageBox。但是,如果我試圖在DLL中的這個ViewController類上調用ANY方法,我得到以下結果:
MfcVSApp1.exe中的0x7c812aeb(kernel32.dll)的第一次機會異常:Microsoft C++異常:EEMessageException at內存位置0x0012cb30 ..
這一切顯然昨天工作。現在一些代碼:
我的包裝實體:
[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引用,包含了用戶控件,這的ViewController:
public class EphemerisViewController
{
public EphemerisViewController()
{
}
public void GetString()
{
MessageBox.Show("me");
}
}
這個DLL也註冊了COM互操作,但我沒有選中該選項,因爲它沒有幫助。上師,我需要幫助。這已經消耗了兩個工作日,而且我已經從我開始的地方回到了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(...)
{
}
}
另外,我還清理和重建,解決了無數次,但沒有運氣。