Здравствуйте!
Есть COM сервер написанный на C++
В нем интерфейс IServController наследуемый от IUnknown В нем есть метод
Код | STDMETHODIMP ServController::PauseServiceById( long id, long* pResult) { MessageBox(NULL,L"Pause",L"Service",MB_OK); return S_OK; } |
Соответственно из C# пытаюсь вызвать его двумя способами: Как в MSDN
Код | namespace ServControllerClassLib { [Guid("1861A83B-70F7-46FE-AEB2-9645DE1FE623"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] interface IServController // Cannot list any base interfaces here { // Note that IUnknown Interface members are NOT listed here:
void ConnectToSC( string Mname, string Login, string Password, string Domain, long pResult );
void PauseServiceById(int i, ref int p); void StopServiceById(long i, long p); void StartServiceById(long i, long p);
void GetServiceNameById(long d, String g); void GetServicesCount(long d); void GetSetviceStatusById(long a,long b);
} [ComImport, Guid("1861A83B-70F7-46FE-AEB2-9645DE1FE623")] class ServController // Cannot have a base class or // interface list here. { } } |
Далее в самом коде
Код | ServControllerClassLib.ServController sController = new ServControllerClassLib.ServController(); ServControllerClassLib.IServController mc= (ServControllerClassLib.IServController)sController; int pResult=100;
mc.PauseServiceById(0,ref pResult); |
и второй способ
Код | Type scType = Type.GetTypeFromProgID("ServController.Component.1"); object obj = Activator.CreateInstance(scType);
Int32 pResult=100; scType.InvokeMember("PauseServiceById", BindingFlags.Public | BindingFlags.InvokeMethod , null, null, new Object[2]{1,pResult}); |
Соответственно в первом случае имею AccessViolation Во втором MissingMethodException
Соответственно ссылки на проекты: https://dl.dropbox.com/u/18970223/COMClient.7z https://dl.dropbox.com/u/18970223/COMSrv.7z
Очень прошу о помощи! :wall: |