2009-06-30 4 views
1

У меня по большей части успешно встроенный firefox/xulrunner в наше приложение C#, но это не без проблем. Как-то раз вы получите исключение AccessViolationException, которое, как я полагаю, вызвано тем, что GC перемещает управляемый объект в память, а неуправляемый xpcom пытается использовать его после его перемещения. Например, я создал обработчик протокола для настраиваемого протокола, который реализует некоторые интерфейсы, к которым обращаются firefox/xulrunner. После этого AccessViolationException стал намного более доминирующим. Я рассматривал GCHandle.Alloc (объект, GCHandleType.Pinned) как возможное решение, но не смог найти достаточно информации о том, как написать настраиваемый маршаллер, чтобы сделать мой класс, который реализовал интерфейсы «blittable». Так есть ли у кого-нибудь какие-либо идеи о том, как справиться с этой проблемой или как перевести мой класс в «легкомысленный»? Также почти невозможно отслеживать, какие части взаимодействия совершают исключение AccessViolationException. Тьфу :-(Встраиваемый firefox/xulrunner, вызывающий AccessViolationException

Спасибо за любую проницательность!

+0

Для тех, кто не знаком с термином "blittable" http://msdn.microsoft.com/en-us/library/aa719638(VS.71).aspx – Davy8

+0

благодаря Дэви boyee !!! – NastyNateDoggy

ответ

2

Я считаю, что у меня есть ответ на этот вопрос с помощью средств другого вопроса, я спросил "does GetComInterfaceForObject pin the object?". В основном то, что я считаю, что AccessViolationExceptions где генерируются объект выходя из области видимости в стороне .net, если мое понимание верное, неуправляемая ссылка не приведет к сохранению управляемого объекта. Таким образом, любой управляемый объект, который я создаю, должен находиться вокруг в течение длительного периода времени, чтобы неуправляемый код мог вызвать его , теперь сохраняется либо в поле, либо в списке. Также на стороне «blittable» объекта я не нашел способ привязать класс, но мне удалось выяснить, как связать структуру, которая реализовала Интерфейс был интерфейсом взаимодействия, в котором был Марс halAs, что позволило преобразовать неуправляемый код, поэтому, по-видимому, позволяет привязывать объект. Не уверен, что это возможно при реализации класса, поскольку я все еще получал ошибки, даже если он был реализован точно так же, как и структура.

:-)