Я использую COM в своем проекте C # .NET.
Однако один из вызываемых мной методов не работает должным образом.
Поэтому мне любопытно посмотреть, что происходит между моим кодом .NET, Interopслой и COM.
Я знаю, что tlbimp.exe
создает оболочку метаданных для компонента COM, и я могу видеть эти сгенерированные методы в обозревателе объектов.
Могу ли я увидеть / отладить, что происходит, когда один из этих оболочекметоды называются?
Я передаю массив в метод ниже и ожидаю, что этот массив будет заполнен, однако массив не заполняется.Я вызываю следующий tlbimp.exe
сгенерированный метод с неожиданными результатами:
int GetTags(System.Array buffer)
Member of CServer.IUser
IDL метода:
[id(0x000000d5)]
HRESULT GetTags(
[in] SAFEARRAY(long) buffer,
[out, retval] long* retval);
.NET-код, вызывающий этот метод:
Array tagsArray = Array.CreateInstance(typeof(int), tagsLength);
userWrapper.GetTags(tagsArray);
Другие COM-методы, которые я называю, работают нормально.Однако, когда я вызываю любой метод, который ожидает Array в качестве параметра, он не работает должным образом.
Я предполагаю, что с маршаллером взаимодействия COM происходит что-то забавное.
Поэтому я хотел бы знать,Я вижу, что происходит после того, как я вызвал метод GetTags()
.
Также я прочитал следующее здесь .
"if you are not satisified with the COM Interop marshaller, you can "override" just about every aspect of it through the very large and useful System::Runtime::InteropServices namespace"
Как мне достичь вышеуказанного?
РЕДАКТИРОВАТЬ: Добавление сценария тестирования Delphi, который работает
procedure TComTestForm.TestUserBtnClick(Sender: TObject);
var
nCnt :integer;
User :IUser;
Persona :IUserPersona;
ArrayBounds :TSafeArrayBound;
ArrayData :Pointer;
TagList :PSafeArray;
nSize :integer;
begin
User := Session.GetUser;
ArrayBounds.lLbound := 0;
ArrayBounds.cElements := 0;
TagList := SafeArrayCreate( varInteger, 1, ArrayBounds );
User.GetTags( TagList );
if SafeArrayAccessData( TagList, ArrayData ) = S_OK then
begin
nSize := TagList.rgsabound[0].cElements;
OutLine( '----Available Tags, ' + IntToStr(nSize) + ' tags' );
for nCnt := 0 to nSize - 1 do
begin
OutLine( IntToStr( IntegerArray(ArrayData)[nCnt] ) );
end;
OutLine( '----');
SafeArrayUnAccessData( TagList );
SafeArrayDestroy( TagList );
end;
end;