我有一個VSIX擴展,它取決於從非託管DLL部署的代碼。我已經將DLL包含在VSIX中,我用zip程序破解了VSIX,以確認它已正確部署。但是,當我使用DllImport屬性時,.NET Framework聲稱它無法找到它。我怎樣才能從我的VSIX打包的DLL中導入函數?使用DllImport找不到VSIX dll
回答
我不知道這裏出了什麼問題,但我重新安裝了Windows和Visual Studio,沒有對該項目進行任何更改,現在一切正常。我還遇到其他一些與其他應用程序查找DLL有關的其他問題,我猜他們是相關的,我必須搞砸了一些設置。
Windows無法打開嵌入到壓縮的.zip
中的DLL文件,因此您必須將其解壓縮並放入您有權訪問的文件夾中。
.NET Framework將在%LocalAppData%
中查找DLL的路徑,因此在其中解壓DLL是合理的。
Visual Studio將文件從VSIX中提取到安裝目錄中。 – Puppy
你可以打開事件日誌並檢查你的包嘗試加載DLL的路徑嗎? https://en.wikipedia.org/wiki/Event_Viewer –
這個工具可能會有所幫助:http://technet.microsoft.com/en-us/sysinternals/bb896645 –
我曾經在似乎隨機的情況下得到虛假的包裝負載故障。這些問題主要影響由多個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));
}
}
}
是的,但我不是在說在這裏加載軟件包。非託管DLL和包使用完全不同的機制。 – Puppy
- 1. dllimport即使在路徑中也找不到dll
- 2. C++ dll使用dllimport c#
- 3. DllImport未找到C++
- 4. 的DllImport沒有找到
- 5. C#/ C++在同一個解決方案 - 的DllImport找不到DLL
- 6. 調用C++的Dll使用的DllImport
- 7. DLLImport在哪裏查找非託管DLL?
- 8. ASP.Net中的DllImport如何查找DLL?
- 9. DllImport user32 vs user32.dll
- 10. C#DLLImport for C++ dll
- 11. 使用dllimport的
- 12. DllImport沒有在SysWOW64文件夾中找到一個DLL
- 13. 「找不到PInvoke DLL」sqlceme35.dll「
- 14. 即使dll與可執行文件在同一文件夾中,DllImport也找不到dll
- 15. 刷新dll收取DllImport
- 16. dllimport無法加載DLL
- 17. dllimport的變量MFC DLL
- 18. DLLImport未能加載DLL
- 19. System.EntryPointNotFoundException和的DllImport( 「KERNEL32.DLL」)
- 20. 正確使用DllImport
- 21. 找不到MSVCP90.dll?
- 22. Warning:找不到dll
- 23. c#dll找不到
- 24. MSVCR90.DLL找不到
- 25. 找不到Microsoft.DiaSymReader.Native.x86.dll
- 26. QtXmld4.dll找不到
- 27. Visual Studio VSIX項目,安裝.vsix時未找到項目模板參考
- 28. 如何調試C++ dll調用C++ DllImport
- 29. LINQPad:嘗試使用使用[DllImport]訪問C++的程序集dll
- 30. 在單點觸摸中使用.net dll時找不到DLL
也許缺少路徑?這有幫助嗎? http://stackoverflow.com/a/10800260/71312 – Diryboy
你確認了非託管dll被正確提取到擴展的安裝目錄?我把一個簡單的VSIX放在一起,它部署了一個調用非託管dll的shell包。我使用Content的構建操作將非託管dll添加到項目,並將其包含在VSIX中。它在調試和常規部署擴展中均可正確運行。 – WarrenG
@WarrenG:我不知道那是哪裏。我爲我的DLL構建動作也是「內容」,我將它設置爲包含在VSIX中。 – Puppy