2013-08-03 31 views
6

ile VSIX DLL'lerini bulamıyorum Yönetilmeyen bir DLL dosyasından dağıtılan koda bağlı bir VSIX uzantısı var. DLL, VSIX ile dahil ettik ve doğru şekilde dağıtıldığını doğrulamak için bir zip programıyla VSIX'i açtım. Ancak, DllImport özniteliğini kullandığımda, .NET Framework bulamadığını iddia ediyor. VSIX'imde paketlenmiş bir DLL'den işlevleri nasıl alabilirim?DllImport

+1

Belki de eksik yollar? Bu yardım eder mi? http://stackoverflow.com/a/10800260/71312 – Diryboy

+0

Yönetilmeyen dll'nin uzantının yükleme dizinine doğru şekilde çıkarıldığını doğruladınız mı? Yönetilmeyen bir dll çağırır bir kabuk paketi dağıtan basit bir VSIX araya koydum. Yönetilmeyen dll'yi, İçeriğin bir oluşturma eylemiyle projeye ekledim ve VSIX'e dahil ettim. Hem hata ayıklamada hem de düzenli olarak dağıtılmış bir uzantı olarak doğru şekilde çalışır. – WarrenG

+0

@WarrenG: Bunun nerede olduğu hakkında hiçbir fikrim yok. Benim DLL için derleme eylemim de "İçerik" ve VSIX içine dahil etmek için ayarlayın. – Puppy

cevap

3

Burada neyin ters gittiğini bilmiyorum, ancak Windows ve Visual Studio'yu yeniden yükledim, projede hiçbir değişiklik yapmadım ve şimdi her şey yolunda. Diğer uygulamalar için DLL'leri bulmakla ilgili başka sorunlarım vardı ve sanırım ilişkilerle ilgili olduklarını sanıyordum, biraz ayar yapmalıydım.

2

Windows, sıkıştırılmış dosyalara gömülü DLL dosyalarını açamıyor; bu nedenle paketi açmanız ve yazıcıya erişiminizin olduğu bir klasöre yerleştirmeniz gerekiyor.

.NET Framework, DLL dosyanızın yollarını %LocalAppData% numaralı telefona bakacaktır, bu nedenle DLL'inizi orada açmak mantıklı olacaktır.

+0

Visual Studio, VSIX'deki dosyaları bir yükleme dizinine ayıklar. – Puppy

+0

Olaylar Günlüğü'nü açabilir ve paketinizin DLL dosyasını yüklemeyi denediğini kontrol edebilir misiniz? https://en.wikipedia.org/wiki/Event_Viewer –

+0

Ve bu araç muhtemelen yardımcı olabilir: http://technet.microsoft.com/en-us/sysinternals/bb896645 –

1

Rasgele durumlarda, hatalı paket yükleme hataları alıyorum. Sorunlar öncelikle birden fazla DLL dosyasından oluşan uzantıları etkiledi. Sonunda uzantıda sağlanan ana Package'a [ProvideBindingPath] özniteliği uygulayarak bunları çözdüm.

Öznitelik kaynağını projenize dahil etmeniz gerekir.

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

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

Evet, ama burada paketleri yüklemekten bahsetmiyorum. Yönetilmeyen DLL'ler ve paketler oldukça farklı mekanizmalar kullanır. – Puppy

İlgili konular