Обходной путь ошибки COM COM VS2010? (INetFwMgr) - PullRequest
3 голосов
/ 13 апреля 2011

( EDIT : решено, решение было простым - соберите 2008SP1, возьмите сгенерированный Interop.NetFwTypeLib.dll и просто используйте его как стороннюю сборку. Спасибо, Рик Сладки.)

Я обновил некоторый код (ниже), ссылающийся на COM-объект, до VS 2010. Все еще на .Net 3.5.
С тех пор сборка нарушена: (The type or namespace name 'INetFwMgr' could not be found (are you missing a using directive or an assembly reference?)) ...

Я обнаружил ошибку Microsoft , где кто-то сказал:

SDK 4.0 tlbimp.exe всегда импортирует Во-первых, это не следует правильный поток. Даже если вы вручную вызовите tlbimp.exe и дайте правильный дорожка. Это коренная причина проблема. Любой dll COM, который находится в поток не по умолчанию будет иметь такой же проблема с tlbimp.exe 4.0.

А затем:

SDK 3.5 tlbimp.exe не имеет этого проблема. Обходной путь должен использовать 3.5 tlbimp.exe для импорта вручную Сборка взаимодействия с полного пути как он хранится в реестре и ссылаться на эту сборку взаимодействия в ваши проекты.

Может кто-нибудь объяснить обходной путь? (Я попробовал очевидное tlbimp COM_DLL /out=OUT_DLL, ничего хорошего).

Кто-то сталкивался с этим с другим COM?

Спасибо!

Примечание: XP ...
Еще одно замечание: попробовал и VS2010 SP1, не повезло.

Код (частичный ...):

using NetFwTypeLib;

namespace Utils
{
    public class MSFirewall
    {
               private const string CLSID_FIREWALL_MANAGER = "{304CE942-6E39-40D8-943A-B913C40C9CD4}";

        private NetFwTypeLib.INetFwMgr GetFirewallManager()
        {
                Type objectType = Type.GetTypeFromCLSID(new Guid(CLSID_FIREWALL_MANAGER));
                return Activator.CreateInstance(objectType) as NetFwTypeLib.INetFwMgr;
        }


    }
}

Ответы [ 2 ]

3 голосов
/ 14 апреля 2011

Ваше решение VS2010 может успешно использовать библиотеку взаимодействия, такую ​​как:

  • Interop.NetFwTypeLib.dll

, созданный либо с помощью служебного решения VS2008, либо созданный вручную с использованием более старых инструментов SDK.

Если вы используете управление исходным кодом, просто сгенерируйте библиотеку взаимодействия с VS2008 один раз и зарегистрируйте ее, а затем добавьте ссылку из решения VS2010 в проверенную библиотеку взаимодействия вместо перехода к компоненту COM.

2 голосов
/ 04 мая 2012

Мы столкнулись с той же проблемой, когда пытались завершить проект, в котором была ссылка на этот COM-объект.

На машине с Windows 7 x64 и VS 2010 он скомпилирован нормально. На машине с Win2003 x64 и VS 2010 (тот же проект в нем) мы получили ошибку компиляции "Не удалось найти тип или имя пространства имен 'INetFwMgr'".

Первое, что я сделал - я установил вывод сборки как "подробный". Я заметил, что это русская команда

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\TlbImp.exe" C:\WINDOWS\SysWOW64\hnetcfg.dll /namespace:NetFwTypeLib /out:"obj\Debug WF\Interop.NetFwTypeLib.dll" /sysarray /transform:DispRet /reference:D:\Projects\Framework\Projects\FrameworkBase\Dlls\KellermanSoftware.NET-Email-Validation.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\TestDriven.NET 2.0\NUnit\2.4\nunit.framework.dll" /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.configuration.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Data.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Drawing.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Management.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Runtime.Remoting.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Runtime.Serialization.Formatters.Soap.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.ServiceProcess.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Web.Services.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Windows.Forms.dll /reference:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\System.Xml.dll /reference:D:\Projects\Framework\Projects\Common\ZipLib\bin\Debug\ZipLib.dll /reference:C:\WINDOWS\assembly\GAC\stdole\7.0.3300.0__b03f5f7f11d50a3a\stdole.dll /keyfile:StrongKey.snk 

и результат этой команды в порядке - он создает файл

"D:\Projects\Framework\Projects\FrameworkBase\obj\Debug WF\Interop.NetFwTypeLib.dll" 

Этот же файл создается на компьютере с Windows 7. Однако есть одно отличие: размеры файлов Interop.NetFwTypeLib.dll очень разные.

Мне кажется, что файлы hnetcfg.dll на компьютере с Windows 7 и Windows 2003 x64 слишком сильно отличаются друг от друга, и, к сожалению, таблица импорта в файле Windows 2003 повреждена.

Я понятия не имею, исправила ли это Microsoft, и если в каком-то обновлении Windows они отправят обычный файл hnetcfg.dll с обычной таблицей импорта. Мне плевать на них.

Я сделал следующее: я получил обычный файл Interop.NetFwTypeLib.dll в Windows 7 и включил его в отдельную папку проекта в систему управления исходным кодом, и поместил ссылку на этот файл (вместо ссылки на COM). И проблема решена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...