Почему приложение C # winforms не работает без установленного VS.NET? - PullRequest
2 голосов
/ 04 июня 2010

У меня есть приложение winforms c #, в котором есть встроенный веб-браузер, созданный в VS.NET 2008. Мы поглощаем события, наследуя наш класс событий от HTMLDocumentEvents2.

 public class IEHTMLDocumentEvents : mshtml.HTMLDocumentEvents2
 {
     public bool onclick(mshtml.IHTMLEventObj pEvtObj)
     {
         // Clicking on an input (checkbox, radio, button, image)
         if (pEvtObj.srcElement.tagName == "INPUT")
         {
             // The following will result in a null pointer without VS.NET installed
             HTMLInputElementClass input = pEvtObj.srcElement as HTMLInputElementClass;
         }
     }
 }

Приведенный выше код отлично работает при нажатии на элементы в элементе управления веб-браузера на наших компьютерах с установленной VS.NET. Однако он не может преобразовать pEvtObj.srcElement, когда VS.NET не установлен. Это сразу начинает работать, когда мы устанавливаем самую простую VS.NET с C #, которую вы можете.

Обратите внимание: остальная часть приложения c # работает нормально, и вы также можете нормально просматривать веб-страницы с помощью элемента управления, просто события, подобные описанному выше onclick, не могут быть обработаны должным образом.

Я думал, что это будет проблема с загрузкой версии DLL, но различие загруженных файлов показывает только незначительные различия.

1c1
< Process: C# App without VS.NET installed
---
> Process: C# App with VS.NET 2008 installed
18d17
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\CustomMarshalers\e148983beeb0f30918b0564849a16456\CustomMarshalers.ni.dll CustomMarshalers.ni.dll Microsoft .NET Framework Custom Marshalers Microsoft Corporation 2.0.50727.3053
36d34
< C:\Documents and Settings\XpHome\Local Settings\History\History.IE5\index.dat index.dat   
37a36
> C:\Documents and Settings\XpHome\Local Settings\History\History.IE5\index.dat index.dat   
44,45c43,44
< C:\Program Files\<hidden>\<hidden>\Microsoft.mshtml.dll Microsoft.mshtml.dll     7.0.3300.1
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\Microsoft.VisualBas#\5b3d048d8c003d743ea5e72caf07773a\Microsoft.VisualBasic.ni.dll Microsoft.VisualBasic.ni.dll Visual Basic Runtime Library Microsoft Corporation 8.0.50727.3053
---
> C:\WINDOWS\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.mshtml.dll Microsoft.mshtml.dll     7.0.3300.1
> C:\WINDOWS\assembly\GAC_MSIL\Microsoft.VisualBasic\8.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualBasic.dll Microsoft.VisualBasic.dll Visual Basic Runtime Library Microsoft Corporation 8.0.50727.3053
50,52c49,51
< c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll mscorjit.dll Microsoft .NET Runtime Just-In-Time Compiler Microsoft Corporation 2.0.50727.3053
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\9adb89fa22fd5b4ce433b5aca7fb1b07\mscorlib.ni.dll mscorlib.ni.dll Microsoft Common Language Runtime Class Library Microsoft Corporation 2.0.50727.3053
< c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll mscorwks.dll Microsoft .NET Runtime Common Language Runtime - WorkStation Microsoft Corporation 2.0.50727.3053
---
> c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorjit.dll mscorjit.dll Microsoft .NET Runtime Just-In-Time Compiler Microsoft Corporation 2.0.50727.3082
> C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\mscorlib\7124a40b9998f7b63c86bd1a2125ce26\mscorlib.ni.dll mscorlib.ni.dll Microsoft Common Language Runtime Class Library Microsoft Corporation 2.0.50727.3603
> c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll mscorwks.dll Microsoft .NET Runtime Common Language Runtime - WorkStation Microsoft Corporation 2.0.50727.3603
94,98c93,97
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Configuration\cb4cb21d14767292e079366a5d3d76cd\System.Configuration.ni.dll System.Configuration.ni.dll System.Configuration.dll Microsoft Corporation 2.0.50727.3053
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Drawing\6978f2e90f13bc720d57fa6895c911e2\System.Drawing.ni.dll System.Drawing.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\aa7926460a336408c8041330ad90929d\System.ni.dll System.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\9a254c455892c02355ab0ab0f0727c5b\System.Windows.Forms.ni.dll System.Windows.Forms.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
< C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml\36f3953f24d4f0b767bf172331ad6f3e\System.Xml.ni.dll System.Xml.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
---
> C:\WINDOWS\assembly\GAC_MSIL\System.Configuration\2.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll System.Configuration.dll System.Configuration.dll Microsoft Corporation 2.0.50727.3053
> C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Drawing\abb2ac7e08bee026f857d8fa36f9fe6f\System.Drawing.ni.dll System.Drawing.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
> C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System\3de5bd01124463d7862bd173af90bc83\System.ni.dll System.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
> C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Windows.Forms\d2ea8d76f015817db1607075812b555f\System.Windows.Forms.ni.dll System.Windows.Forms.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3053
> C:\WINDOWS\assembly\NativeImages_v2.0.50727_32\System.Xml\5913d3f81e77194ec833991b1047a532\System.Xml.ni.dll System.Xml.ni.dll .NET Framework Microsoft Corporation 2.0.50727.3082

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Хорошо, наконец-то нашел ответ. Похоже, что даже если он успешно загружает microsoft.mshtml.dll, который мы распространяем вместе с приложением. Доступ к интерфейсам COM невозможен, если вы не зарегистрируете его в GAC на клиентском компьютере с помощью regasm.exe.

1 голос
/ 04 июня 2010

Теоретически, поскольку версия IE на вашем компьютере и версия IE на компьютере пользователя могут различаться, вам нужно сгенерировать оболочки для версии IE пользователя. Это можно сделать в установщике, добавив настраиваемое действие, которое запускает tlbimp mshtml.tlb в командной строке, но для этого сначала требуется .Net SDK на компьютере, и в библиотеке типов IE6 была ошибка *1002*, которая сгенерируйте неверную подпись для события, поэтому вы можете захотеть отправить версию IE7 для пользователей IE6 на случай, если код будет зависеть от события, которое нужно запустить.

К счастью, большинство интерфейсов в библиотеке типов IE не менялись годами (для интерфейсов, которые вам наиболее интересны). Вы можете отправить свое приложение с Microsoft.mshtml.dll, который входит в состав Office PIA, чтобы вы могли найти необходимые пакеты от разработчиков Office.

Или, что еще лучше, вы можете написать меньшую сборку, содержащую только используемый вами интерфейс, и распространять ее. Visual Studio 2010 делает это за вас, хотя может быть не совсем .

0 голосов
/ 04 июня 2010

Отметьте внешнюю ссылку (dll) веб-браузера в вашем проекте, чтобы она всегда копировалась в выходной каталог при создании prj.

...