【发布时间】:2011-07-05 22:07:35
【问题描述】:
向我证明了一个噩梦般的 COM 互操作。我有一个包含 WPF 窗口的简单托管 DLL。我有一个简单的 ViewController 类,它最终会启动这个窗口,但现在有一个什么都不做的空方法。
我为这个托管 DLL 创建了一个托管包装器,它公开了一个为 COM 互操作注册的接口。我可以调用我的托管包装器 OK。我可以在我的托管包装 DLL 的入口点显示一个 MessageBox。但是,如果我尝试在要包装的 DLL 中对该 ViewController 类调用任何方法,我会得到:
MfcVSApp1.exe 中 0x7c812aeb (kernel32.dll) 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0012cb30 处的 EEMessageException..
显然昨天一切正常。现在一些代码:
我的包装实体:
[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:
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(...)
{
}
}
另外,我已经多次清理和重建解决方案,但没有运气。
【问题讨论】: