2011-07-28 6 views
9

Mam obiekt COM innej firmy (32-bitowy), który muszę wywołać z mojej aplikacji C# (64-bitowy). Wiem, że muszę uruchomić obiekt COM w oddzielnym procesie. Ten obiekt COM ma zaimplementowane wiele klas, więc staram się unikać pisania własnego opakowania zdalnego przetwarzania, które eksponuje wszystkie metody. COM + wydaje się być najprostszym rozwiązaniem. Otworzyłem menu Component Services, utworzyłem nową aplikację COM +, dodano mój obiekt COM jako składnik do tej aplikacji. Wszystko zdawało się pięknie importować.Wywołanie 32-bitowego COM z C# działa w trybie 64-bitowym

W mojej aplikacji C# dodałem oryginalny obiekt COM jako odniesienie (który automatycznie generuje bibliotekę typów). Korzystając z odwołania do biblioteki typów, mogę tworzyć obiekty ze składnika COM + (widzę, że zaczynają się one obracać w oknie Component Services), ale kiedy próbuję uzyskać dostęp do metod obiektu, pojawia się błąd informujący, że interfejs nie jest zarejestrowany.

Czy ktoś ma jakąś wskazówkę? Wróciłem i uruchomiłem regsvr32 na obiekcie COM, ale nie sądzę, że było to konieczne i nie pomogło. Czy moje użycie w języku C# jest poprawne? Autouzupełnianie VS2008 nie stanowiło problemu z obejrzeniem tych metod.

Dokładna Wyjątkiem jest: „Interfejs niezarejestrowany (Wyjątek od HRESULT: 0x80040155)”

jasne, co dokładnie uprawnienia i role są ow Usług Component, Próbowałem konfigurowania tożsamości COM + dopełnienie do uruchamiane w ramach konta systemowego, zarówno jako usługa lokalna, jak i jako użytkownik interaktywny. Dodałem Wszyscy jako użytkownika w rolach. Wszystko działa lokalnie, więc nie powinno być problemu z uprawnieniami do plików ani czymś podobnym.

Chcę również powtórzyć, że ten obiekt COM zawiera wiele klas. Udało mi się utworzyć instancję jednego obiektu klasy w moim kliencie i ustawić niektóre wartości właściwości. Udało mi się również utworzyć instancję innego obiektu klasy, ale otrzymałem ten wyjątek podczas próby wywołania metody tego drugiego obiektu .... tak więc nie myślę, że jest problem z którym rejestru mój obiekt COM jest zarejestrowany.

+0

COM + jest bardzo zależny od praw/uprawnień itp. być może to, co się dzieje ... – Yahia

+4

Windows skutecznie ma dwa różne rejestry, jeden dla 32 i jeden dla 64 bitów. Wierzę, że interfejs jest zarejestrowany w jednym, a następnie patrzy w innym. – GSerg

+0

GSerg jest poprawny. Jeśli aplikacja, która je rejestruje, jest 32-bitowa i działa w systemie 64-bitowym, wszystkie wpisy rejestru trafiają do lustrzanego węzła WOW6432, a nie do miejsca, do którego normalnie by się udały. –

Odpowiedz

2

Mieliśmy podobną sytuację, pracując z biblioteką dll COM z VFP.

Wszystko zależy od praw i uprawnień, tak jak mówi Yahia. Dostaliśmy to działa w ten sposób:

  • Install VFP OLEDB 9 sterowników (nie wiem, co masz, więc prawdopodobnie nie jest wymagane).
  • przekazać usługę sieciową IIS_IUSR pełną kontrolę nad folderem COM (wymagane, aby biblioteka DLL mogła zrobić pewne logowanie w swoim własnym folderze, po wywołaniu ze strony internetowej).
  • uruchom plik regsvr32.exe "c: \ xxx \ yourfile.dll" -> powinno to odnieść sukces!
  • Tworzenie aplikacji COM + i dodać DLL jako część
  • Ustaw COM aplikacji + poświadczeń na wigh użytkownika wystarczające prawa

i musieliśmy zrobić jeszcze kilka ustawień na prawach w puli aplikacji/IIS ale to chyba nie jest wymagane dla ciebie.

Tak czy inaczej, po prostu upewnij się, że masz wystarczająco dużo rejestrowanie, upewnij się, że dll jest zarejestrowany, a potem jej wszystko o prawach praw praw ..

Powodzenia z tym!

1

Przepraszam, że używam odpowiedzi do komentarzy, ale wydaje mi się, że to moja jedyna droga.

Celem przeniesienia się do 64-bitowego systemu operacyjnego było uzyskanie dodatkowej adresowalnej przestrzeni pamięci, więc uruchomienie całej aplikacji w trybie 32-bitowym nie jest opcją.

Może to być istotne dla problemu, że po pomyślnym utworzeniu trzech obiektów klasy, byłem w stanie ustawić właściwości w jednym, wywołać metodę bez argumentów w drugiej, ale to było wywoływanie metody w trzeciej, która miała dwa pozostałe obiekty jako argumenty, które rzuciły wyjątek.