我有一个 VSIX 扩展,它依赖于从非托管 DLL 部署的代码。我已将 DLL 包含在 VSIX 中,并使用 zip 程序打开了 VSIX,以确认它已正确部署。但是,当我使用 DllImport 属性时,.NET Framework 声称它找不到它。如何从打包在 VSIX 中的 DLL 导入函数?
问问题
954 次
3 回答
3
我不知道这里出了什么问题,但我重新安装了 Windows 和 Visual Studio,没有对项目进行任何更改,现在一切都很好。我在为其他应用程序查找 DLL 时遇到了一些其他问题,我猜它们是相关的,我一定只是搞砸了一些设置。
于 2013-08-10T00:28:37.187 回答
2
Windows 无法打开嵌入到压缩文件中的 DLL 文件.zip
,因此您必须将其解压缩并放入您有权写入的文件夹中。
.NET Framework 将在 .NET 中查找 DLL 的路径%LocalAppData%
,因此在此处解压缩 DLL 是合理的。
于 2013-08-07T17:02:00.840 回答
1
我曾经在看似随机的情况下得到虚假的包加载失败。这些问题主要影响由多个 DLL 文件组成的扩展。我终于通过将[ProvideBindingPath]
属性应用于Package
扩展中提供的 main 来解决它们。
您需要在项目中包含属性的来源。
/***************************************************************************
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));
}
}
}
于 2013-08-10T05:30:00.653 回答