Какой кошмар COM-взаимодействия доказывает мне.У меня есть простая управляемая DLL, содержащая окно WPF.У меня есть простой класс ViewController, который в конечном итоге будет запускать это окно, но сейчас у него есть пустой метод, который ничего не делает.
Я создал управляемую оболочку для этой управляемой DLL, которая предоставляет интерфейс, зарегистрированный для взаимодействия COM.Я могу позвонить в мою управляемую упаковку ОК.Я могу отобразить MessageBox в точке входа моей управляемой DLL-библиотеки-оболочки.Однако, если я пытаюсь вызвать ЛЮБОЙ метод для этого класса ViewController в DLL, которую я упаковываю, я получаю следующее:
Исключение первого шанса в 0x7c812aeb (kernel32.dll) в MfcVSApp1.exe: исключение Microsoft C ++:EEMessageException в ячейке памяти 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-оболочка, содержит 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(...)
{
}
}
Кроме того, я много раз чистил и перестраивал решение, но неудачи.