2013-08-03 34 views
6

Tôi có phần mở rộng VSIX phụ thuộc vào mã được triển khai từ một DLL không được quản lý. Tôi đã bao gồm các DLL với VSIX, và tôi nứt mở VSIX với một chương trình zip để xác nhận rằng nó được triển khai một cách chính xác. Tuy nhiên, khi tôi sử dụng thuộc tính DllImport, .NET Framework tuyên bố rằng nó không thể tìm thấy nó. Làm thế nào tôi có thể nhập khẩu các chức năng từ một DLL được đóng gói bên trong VSIX của tôi?Không thể tìm thấy tập tin VSIX dllImport

+1

Có thể thiếu đường dẫn? Điều này có giúp ích không? http://stackoverflow.com/a/10800260/71312 – Diryboy

+0

Bạn đã xác nhận rằng dll không được quản lý đang được trích xuất chính xác vào thư mục cài đặt của tiện ích chưa? Tôi đặt cùng một VSIX đơn giản triển khai một gói shell gọi một dll không được quản lý. Tôi đã thêm dll không được quản lý vào dự án với một hành động xây dựng của Nội dung và bao gồm nó trong VSIX. Nó chạy đúng cả trong gỡ lỗi và như là một phần mở rộng được triển khai thường xuyên. – WarrenG

+0

@WarrenG: Tôi không biết nó ở đâu. Xây dựng hành động của tôi cho DLL của tôi cũng là "Nội dung" và tôi đặt nó để bao gồm trong VSIX. – Puppy

Trả lời

3

Tôi không biết điều gì đang xảy ra ở đây, nhưng tôi đã cài đặt lại Windows và Visual Studio, không thay đổi dự án và bây giờ mọi thứ đều ổn. Tôi đã có một số vấn đề khác với việc tìm kiếm DLL cho các ứng dụng khác, và tôi đoán chúng có liên quan, tôi phải có một số thiết lập.

2

Windows không thể mở tệp DLL được nhúng vào nén .zip, vì vậy bạn sẽ phải giải nén và đặt vào thư mục nơi bạn có quyền truy cập để ghi vào.

.NET Framework sẽ tìm đường dẫn của các tệp DLL của bạn trong %LocalAppData%, do đó, việc giải nén tệp DLL của bạn là hợp lý.

+0

Visual Studio trích xuất các tệp từ VSIX vào thư mục cài đặt. – Puppy

+0

Bạn có thể mở Nhật ký sự kiện và kiểm tra xem đường dẫn nào gói của bạn cố tải DLL không? https://en.wikipedia.org/wiki/Event_Viewer –

+0

Và công cụ này có thể giúp: http://technet.microsoft.com/en-us/sysinternals/bb896645 –

1

Tôi đã từng gặp lỗi tải gói giả mạo trong các tình huống dường như ngẫu nhiên. Các vấn đề chủ yếu ảnh hưởng đến các phần mở rộng bao gồm nhiều hơn một tập tin DLL. Cuối cùng tôi đã giải quyết chúng bằng cách áp dụng thuộc tính [ProvideBindingPath] cho chính Package được cung cấp trong tiện ích.

Bạn sẽ cần bao gồm nguồn cho thuộc tính trong dự án của mình.

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

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

Vâng, nhưng tôi không nói về tải gói ở đây. DLL không được quản lý và các gói sử dụng các cơ chế khá khác nhau. – Puppy