web-dev-qa-db-ja.com

「ファイルがアクセス可能であり、有効なアセンブリまたはCOMコンポーネントであることを確認してください」を解決するにはどうすればよいですか?

C#でOpenCVを使用してプロジェクトを構築しています。 cvextern.dllというdllファイルが必要です。ただし、このファイルを参照として追加すると、次のメッセージが表示されます。

参照「cvextern.dll」は追加できません。ファイルがアクセス可能であり、有効なアセンブリまたはCOMコンポーネントであることを確認してください。

検索に疲れた

50
Omar Osama

ファイルはネイティブDLLです。つまり、[参照の追加]で.NETプロジェクトに追加することはできません... DllImportで使用できます( http:// msdn.Microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx

26
Yahia

私の場合、.dllを登録する必要がありました。

これを行うには、cmd.exe(コンソール)を管理者権限で開き、次を入力します。

regsvr32 "foo.dll"
25
user2248818

アプリケーションをビルドするときに、必要なdllがbinフォルダーにエクスポート(または手動でコピー)されていることを確認してください。

4
billy

私は同じプログラムを持っていた、これが役立つことを願っています。

Windows 7を使用している場合は、コマンドプロンプトを開き、管理者として実行します。 <...>。dllを登録します。

管理者として実行する理由は、Windowsスタートでの実行を使用して<...>。dllを登録できますが、アカウントが管理者であっても、dllはユーザーとしてのみ実行されます。

これで、プロジェクト->参照の追加->参照で<...>。dllを追加できます。

ありがとう

3
simoncsunas

「それ」にはcvextern.dllというdllファイルが必要です。 「それ」は、プロジェクトで使用している独自のcsファイルまたは他のサードパーティDLLのいずれかです。

ネイティブdllを独自のcsファイルに呼び出すには、dllをプロジェクトのroot\libディレクトリにコピーし、既存のアイテムとして追加します。 (既存のアイテムを追加)、正しい場所でDllimportを使用します。

サードパーティの場合、ネイティブライブラリをサードパーティライブラリが存在するフォルダにコピーし、既存のアイテムとして追加します。

ビルド後、必要なdllがBuildフォルダーに表示されていることを確認してください。場合によっては、Buildフォルダーに表示されないか、置き換えられます。 Buildフォルダーを手動で削除して、再度ビルドします。

2
Jerin

hereTheMattsterで答えを探してください。私はそれを実装し、それは魅力のように働きました。一言で言えば、彼のソリューションは、プロジェクトにリソースとしてCOM dllを追加することを提案し(したがって、プロジェクトのdllにコンパイルされます)、最初の実行時にファイルに書き込みます(つまり、最初にそこに必要なdllファイル)場所)。

以下は彼の答えから取ったものです。

ステップ1)DLLをリソースとして追加します(「Resources.DllFile」以下)。プロジェクトを開くには、[リソース]タブを選択し、[既存のファイルを追加]を選択して= DLLリソースとして。

ステップ2)DLLの名前を文字列リソースとして追加します( "Resources.DllName"として)。

ステップ3)このコードをメインフォームロードに追加します。

if (!File.Exists(Properties.Resources.DllName))
{
    var outStream = new StreamWriter(Properties.Resources.DllName, false);
    var binStream = new BinaryWriter(outStream.BaseStream);
    binStream.Write(Properties.Resources.DllFile);
    binStream.Close();
}

私の問題は、プロジェクトでCOM dllを使用する必要があるだけでなく、ClickOnceを使用してアプリでデプロイする必要があり、プロジェクトに参照を追加することなく、上記のソリューションが実際に唯一のものであるということでした働いた。

2
gneri

私の場合、ワークスペースにアンマネージdll(C++)があり、指定する場合:

<files>
    <file src="bin\*.dll" target="lib" />
</files>

nugetは、すべてのdllをアセンブリとして(C++ライブラリも)ロードしようとします!この動作を回避するには、C#アセンブリをreferencesタグで明示的に定義します。

<references>
    <reference file="Managed1.dll" />
    <reference file="Managed2.dll" />
</<references>

備考:参照の親はメタデータです->ドキュメントによると https://docs.Microsoft.com/en-us/nuget/ reference/nuspec#general-form-and-schema

ドキュメント: https://docs.Microsoft.com/en-us/nuget/reference/nuspec

0
leon22