Моно и window.external

Это будет приложение Windows Forms, развернутое с помощью ClickOnce. План состоит в том, чтобы использовать элемент управления WebBrowser для предоставления веб-приложения, использующего элементы управления Active-X. Используя window.external и InvokeScript, объекты будут заменены ссылками на COM-объекты без регистрации (SXS). Я знаю, это звучит как беспорядок, но это меньшее зло, а у меня плотный график. В конце концов, часть SXS может быть заменена, и, надеюсь, код на стороне сервера может быть обновлен чем-то лучшим. Будут ли при этом серьезные проблемы с производительностью? Сколько проблем я прошу с этим?

Упростит ли выбор .NET 2.0 код, переносимый между Mono и .NET? Является ли код VB.NET проблематичным для переноса на Mono? Я так понимаю не должно быть? (Я работаю с программистами VB6).

В документах говорится, что window.external недоступен в Mono. Похоже, что есть планы реализовать это. Безопасно ли просто использовать window.external сейчас и ждать, пока Mono его реализует? Или есть способ подражать этому?

У меня есть другие планы постепенно сделать код более переносимым, и я надеюсь, что смогу использовать это как своего рода метод (читай: лазейку), чтобы сделать это возможным.

Если у вас есть предложения по отношениям и состояниям ума, я тоже буду рад их услышать. Но, пожалуйста, постарайтесь сначала ответить на мои основные вопросы. Спасибо.


person user120242    schedule 05.07.2009    source источник
comment
Пожалуйста, добавьте больше деталей. Нет необходимости читать теги, чтобы знать, что вы спрашиваете о внешнем свойстве объекта окна в JavaScript, когда этот сценарий выполняется в элементе управления Windows Forms WebBrowser.   -  person John Saunders    schedule 06.07.2009


Ответы (2)


Я не совсем понимаю, что вы пытаетесь сделать, но я вижу конкретные слова, на которые я могу ответить:

  • Моно не поддерживает ClickOnce.
  • Моно не поддерживает ActiveX. Есть некоторые материалы COM, но я не знаю, насколько они полны.
  • Элемент управления Mono WebBrowser поддерживает основные операции, однако window.external — это очень расширенная функциональность, которая очень специфична для IE. В настоящее время в элемент управления WebBrowser не вносится никакой работы, и я не вижу, чтобы это изменилось в ближайшее время, если только кто-то не внесет то, что вам нужно.

Упростит ли таргетинг на .NET 2.0 перенос кода между Mono и .NET?

Я предполагаю, что это противоречит ориентации на .NET 3.5, а не на .NET 1.1. Библиотеки классов .NET 2.0 намного полнее, чем библиотеки .NET 3.0/3.5 (без WPF, без WF, ограниченный WCF). Однако, если вам нужны только функции C# 3, такие как LINQ, все C# 3 должны работать нормально.

Является ли код VB.NET проблематичным для переноса на Mono?

C# определенно лучше поддерживается, чем VB.Net в Mono. Компилятор VB.Net в настоящее время имеет версию 8.0 (2005 г.). Библиотека классов времени выполнения VB.Net также не завершена. (Хотя вы можете полностью избежать этого и по-прежнему использовать VB.Net.)

person jpobst    schedule 05.07.2009
comment
ClickOnce не имеет большого значения, как и ActiveX. В конечном итоге все это будет заменено управляемым кодом, и если бы я попытался развернуть его на Mono, это, вероятно, все равно был бы просто установщик (с пакетом Mono). Тот факт, что элемент управления WebBrowser не требует дополнительной работы, по-видимому, означает, что моя надежда на то, чтобы сделать эту часть переносимой, бесполезна. - person user120242; 06.07.2009
comment
Насколько вероятно, что я взломаю часть WebBrowser в Mono. Эта часть Mono сейчас в большом беспорядке? По крайней мере, это можно использовать? - person user120242; 06.07.2009
comment
Извините, я не ясно выразился. Базовая функциональность WebBrowser работает, а window.external — нет. Глядя на то, что делает window.external, кажется, что это специфично для IE. Элемент управления Mono WebBrowser использует Gecko (Mozilla) в качестве серверной части. - person jpobst; 06.07.2009

Вот хак для имитации windows.external в элементе управления .NET WebBrowser:

В своем коде javascript, который вы поместили в элемент управления веб-браузером, инкапсулируйте свои вызовы в window.external (например):

function wex () { window.external.WBEvent (аргументы [0], аргументы [1]); вернуть ложь; }

Измените функцию для навигации, но с вашим собственным протоколом:

function wex() { location.href = 'wex://ДОМЕН//' + аргументы [0] + '//' + аргументы [1]; вернуть ложь; }

Перехватите и отмените навигацию в коде Visual Basic:

  Private Sub WebBrowser_Navigating(ByVal sender As Object, _
             ByVal e As System.Windows.Forms.WebBrowserNavigatingEventArgs) _
             Handles WebBrowser.Navigating

    With e
        If .Url.AbsoluteUri.StartsWith("wex://") Then
            Dim str As String = HttpUtility.UrlDecode(.Url.AbsoluteUri)
            Dim pos As Integer = InStr(14, str, "//")
            WBEvent(Mid(str, 15, pos - 15), Mid(str, pos + 2))
            'Debug.Print("wex " & Mid(str, 15, pos - 15) & " " & Mid(str, pos + 2))
            e.Cancel = True
        End If
    End With
End Sub

ДОМЕН будет преобразован в нижний регистр. Вот почему это игнорируется.

Если у вас более одной функции, пусть это будет первая часть uri и выполните оператор select в коде события навигации.

person Larry Gates    schedule 04.12.2009
comment
Это приводит к очистке свойства Document элементов управления браузера. Что затем делает невозможным обратный вызов сценария с помощью Document.InvokeScript. Только в моно, конечно. Какие-либо предложения? - person Fantius; 09.02.2011