アンマネージ DLL からデプロイされたコードに依存する VSIX 拡張機能があります。VSIX に DLL を含め、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 は で DLL のパスを検索するため、%LocalAppData%
そこに DLL を展開するのが合理的です。
于 2013-08-07T17:02:00.840 に答える
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));
}
}
}
于 2013-08-10T05:30:00.653 に答える