2013-08-03 2 views
6

У меня есть расширение VSIX, которое зависит от кода, развернутого из неуправляемой библиотеки DLL. Я включил DLL с VSIX, и я взломал VSIX с помощью zip-программы, чтобы подтвердить, что она развернута правильно. Однако, когда я использую атрибут DllImport, .NET Framework утверждает, что он не может его найти. Как импортировать функции из DLL, упакованной внутри моего VSIX?Не удается найти DLL VSIX с DllImport

+1

Возможно, отсутствуют пути? Помогает ли это? http://stackoverflow.com/a/10800260/71312 – Diryboy

+0

Вы подтвердили, что неуправляемая dll извлекается правильно в каталог установки расширения? Я собрал простой VSIX, который развертывает пакет оболочки, который вызывает неуправляемую dll. Я добавил неуправляемую dll в проект с действием сборки Content и включил его в VSIX. Он корректно работает как в отладочном, так и в обычном развернутом расширении. – WarrenG

+0

@WarrenG: Я понятия не имею, где это. Мое действие сборки для моей DLL - это также «Контент», и я включил его в VSIX. – Puppy

ответ

3

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

2

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

.NET Framework будет искать пути ваших DLL в %LocalAppData%, поэтому разумно распаковать вашу DLL там.

+0

Visual Studio извлекает файлы из VSIX в каталог установки. – Puppy

+0

Можете ли вы открыть журнал событий и проверить, на каком пути ваш пакет пытается загрузить DLL? https://en.wikipedia.org/wiki/Event_Viewer –

+0

И этот инструмент, вероятно, может помочь: http://technet.microsoft.com/en-us/sysinternals/bb896645 –

1

Раньше я получал ложные сбои загрузки пакетов в казалось бы случайных ситуациях. Проблемы в первую очередь затрагивали расширения, состоящие из более чем одного DLL-файла. Я, наконец, разрешил их, применив атрибут [ProvideBindingPath] к основному Package, указанному в расширении.

Вам нужно будет указать источник для атрибута в вашем проекте.

/*************************************************************************** 

Copyright (c) Microsoft Corporation. All rights reserved. 
This code is licensed under the Visual Studio SDK license terms. 
THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF 
ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY 
IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR 
PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT. 

***************************************************************************/ 

using System; 
using System.Text; 

namespace Microsoft.VisualStudio.Shell 
{ 
    /// <summary> 
    /// This attribute registers a path that should be probed for candidate assemblies at assembly load time. 
    /// 
    /// For example: 
    /// [...\VisualStudio\10.0\BindingPaths\{5C48C732-5C7F-40f0-87A7-05C4F15BC8C3}] 
    ///  "$PackageFolder$"="" 
    ///  
    /// This would register the "PackageFolder" (i.e. the location of the pkgdef file) as a directory to be probed 
    /// for assemblies to load. 
    /// </summary> 
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
    public sealed class ProvideBindingPathAttribute : RegistrationAttribute 
    { 
     /// <summary> 
     /// An optional SubPath to set after $PackageFolder$. This should be used 
     /// if the assemblies to be probed reside in a different directory than 
     /// the pkgdef file. 
     /// </summary> 
     public string SubPath { get; set; } 

     private static string GetPathToKey(RegistrationContext context) 
     { 
      return string.Concat(@"BindingPaths\", context.ComponentType.GUID.ToString("B").ToUpperInvariant()); 
     } 

     public override void Register(RegistrationContext context) 
     { 
      if (context == null) 
      { 
       throw new ArgumentNullException("context"); 
      } 

      using (Key childKey = context.CreateKey(GetPathToKey(context))) 
      { 
       StringBuilder keyName = new StringBuilder(context.ComponentPath); 
       if (!string.IsNullOrEmpty(SubPath)) 
       { 
        keyName.Append("\\"); 
        keyName.Append(SubPath); 
       } 

       childKey.SetValue(keyName.ToString(), string.Empty); 
      } 
     } 

     public override void Unregister(RegistrationContext context) 
     { 
      if (context == null) 
      { 
       throw new ArgumentNullException("context"); 
      } 

      context.RemoveKey(GetPathToKey(context)); 
     } 
    } 
} 
+0

Да, но я не говорю о загрузке пакетов здесь. Неуправляемые библиотеки DLL и пакеты используют совершенно разные механизмы. – Puppy