DLLへの参照を追加できませんでした


95

C#アプリケーションで参照として.dllファイルを追加すると、エラーが表示されます。

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

ILDissassemblerは有効なCLRヘッダーがないと言っているので、regsvr32を使用して登録しようとすると、別のエラーが発生します。

モジュール ""は読み込まれましたが、DLLRegisterServerの呼び出しはエラーコード '0x80004005'で失敗しました

64ビットWindows 7マシンでVS2010の最終バージョンを使用しています。何が問題でしょうか?

ヒント/返信をありがとう

回答:


53

以下は私のために働きました:

短い答え

コマンドライン(cmd)を介して以下を実行します。

TlbImp.exe cvextern.dll        //where cvextern.dll is your dll you want to fix.

そして、有効なDLLが作成されます。

より長い答え

  • コマンドを開く

  • TlbImp.exeを見つけます。おそらくC:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.0A \ Binにあります。見つからない場合は、ルートフォルダー(C:\またはD :)に移動して実行します。

    dir tlbimp.exe /s              //this will locate the file.
  • tlbimp.exeを実行し、その背後にdllを置きます。例:DLLがcvextern.dllの場合。以下を実行できます。

    TlbImp.exe cvextern.dll
  • tlbimp.exeと同じフォルダに新しいdllが作成されました。これをプロジェクトの参照として使用できます。

5
TlbImp.exeにアクセスする別の方法は、Visual Studioコマンドプロンプトを開くことです。
スコット

75
@Memet Afer私が得たこれを試して、TlbImp : error TI0000 : The input file 'c:\Program Files\Microsoft SDKs\Windows\ v7.0A\bin\MyLibrary.dll' is not a valid type library.何か提案はありますか?
Dineshkumar 14

1
入力ファイルC:\ Windows \ SYSTEM32 \ SqlServerSpatial.dll 'は有効なタイプライブラリではありません
Christine

7
Dineshkumar Ponnusamyによって述べられたのと同じエラーを持っています。私を助けてください
デスレース2015年

1
TLBMPを使用する必要があるのはいつですか?通常、VS2015では、参照ウィンドウからCOM DLLへの参照を追加するだけで、すべての処理が自動的に行われます。
UuDdLrLrSs 2017年

20

DLL(またはEXE)は、.NETアセンブリの場合にのみプロジェクトに追加できます。そうでない場合は、このエラーメッセージが表示されます。

regsvr32はまた、DLLの構造とエクスポートされた関数について特定の仮定を行います。私がそれを使用してから久しぶりですが、COMサーバーの登録に関係しているため、特定のエントリポイントを使用できるようにする必要があります。regsvr32が失敗した場合、DLLはそれらのエントリポイントを提供せず、DLLにはCOMコンポーネントが含まれていません。

DLLを使用する唯一のチャンスは、他の非.NETバイナリのようにインポートすることです。たとえば、特定のWin32 APIを使用する場合などです。役に立つかもしれない古いMSDN Magazineの記事があります。記事の入手先については、次の更新を参照してください。

2018年3月12日更新: MSDNマガジンへのリンクは、2010年8月に使用されていたように機能しなくなりました。MSDN Magazineの2010年7月号に掲載されました。「Wayback Machine」には現在記事があります(フォーマットは限定されています)。2010年7月のMSDN Magazineの全号はこちらから入手できます(HCM形式のみ、HCMファイルの使用方法の説明はこちら)。


参照ではない場合でも、コンパイラーが.dllを出力フォルダーに配置することを確認する方法はありますか?
カイルデラニー

1
@KyleDelaneyコンパイラーができるとは思いません。プロジェクトまたはソリューションのビルド前/ビルド後のイベントにコピーまたはxcopyコマンドを配置することを検討します。しかし、それは手動ですが、一般的に参照はあまり頻繁に変更されず、適切なテストスイートは、ビルド前/ビルド後のイベントで実行されたコマンドを更新するのを忘れた場合をキャッチします。
Manfred

返信いただきありがとうございます!
カイルデラニー

記事へのリンクは死んでいます。
Roald

@Roaldありがとうございます。はい、リンクは実際に壊れています。Microsoftは、MSDNマガジン全体の問題のHCM形式を別のURLでのみ提供しています。ウェイバックマシンには、HTML形式の記事のスナップショットもあり、外観は単純化されています。これを反映するように回答を更新し、回答から壊れたリンクも削除しました。お役に立てれば。
Manfred

12

依存関係ウォーカーを使用して、dllが持っていた内部参照をチェックアウトしました。VBランタイムmsvbvm60.dllが必要であることがわかりました。私の開発ボックスにインストールされていないため、regsvr32を使用して登録することができませんでした。

それが今のところ私の元の質問に対する答えのようです。


私の場合、参照しようとしているプロジェクトのobjフォルダーを削除してから、プロジェクトを再ビルドしました。
Tolu

7

x86 dllを参照する場合は、コンパイラがx86に設定されていることを確認してください...

私は同様の問題を抱えていました...上記のように、OLEDBを使用してVisual Studio 2012のC#コードからExcelファイルにアクセスしようとしました。

Accessライブラリにアクセスできないというエラーが何度も表示されましたが、ロードしたことはわかっていました。

デバッグ中に、64ビット用にコンパイルしているのにOffice x86がロードされていることがわかりました。32ビットのAccessライブラリをロードしても、アプリで使用されることはなかったため、アクセスできませんでした。

これは私がC#で使用していたものです:

"Provider = Microsoft.ACE.OLEDB.12.0; Data Source =" + strFilePath + "; Extended Properties = 'Excel 12.0 Xml; HDR = Yes'";

...エラーが発生しました

コンパイラをx86に切り替えるとすぐに機能しました


2

私はちょうどその問題に遭遇しました、そしてコマンドプロンプトでそれを修正することに関するすべての説明の後に、私がそれをプロジェクトに直接追加するなら、それはそれが必要とする各ページにライブラリを単に含めることができることがわかりました


2

プロジェクトにWinSCard.dllをインポートすることで同じ問題があります。私はこのようにdllから直接インポートすることを扱います:

[DllImport("winscard.dll")]
public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext);

[DllImport("winscard.dll")]
public static extern int SCardReleaseContext(int phContext);

これを個別のプロジェクトに追加してから、メインプロジェクトからの参照を追加できます。


1

ソリューションのビルド中にPCを再起動した後、この問題が発生しました。2つの参照がなくなったため、2つのプロジェクトを手動で再構築する必要があり、エラーなしで参照を追加できました。


1

ネイティブ DLL への参照を追加することはできません。ただし、それらをソリューションに含めることはできます(ソリューションを右クリックし、[既存のファイルを追加]を選択します)。ただし、次のように宣言しない限り、それらは参照されません。

[DllImport("...")]
public static extern void MyFunction();

おそらく、実際に参照しているDLLインポートを含む、ある種のラッパー DLL があるかもしれません。

場合によっては、ラッパーDLLを参照してもプログラムを実行できないことがあります。この場合、エラープロンプトで、ファイルが存在し、すべての依存関係が利用可能であることを確認するように求められます。

この問題は、追加しようとしているアセンブリがx86またはx64プロセッサアーキテクチャのみを対象としてコンパイルされているためです。

ビルド -> 構成マネージャーでターゲットプラットフォームをx86またはx64に変更してみてください。


1

構成マネージャーでアーキテクチャをx64からx86に変更し、32ビットのdll(C言語-pcProxAPI.dll)をこれが作成した新しいフォルダーにコピーする必要がありました。これは、以下の「Sashus」で説明されている手順の上にあります。

C:\ Projects .. \ bin \ x86 \ Debug


これは私にとっても彼の問題でした。
rogue39nin

しかし、デフォルトがx86でもx64でもない場合はどうなりますか?しかし....「Any Cpu」が表示されました...?
グムル

codeproject.com/articles/1160645/…32ビットDLLをそこにコピーすると、どのCPUも同様に機能する可能性があります
boateng

1

C ++でコーディングしたdllを新しいC#プロジェクトに追加しようとしたときにも、同じ問題が発生しました。私のdllのC ++プロジェクトのプロパティを設定する必要があることがわかりました:

  • Configuration Properties\General\Common Language Runtime Support: /clr
  • Configuration Properties\C/C++\General\Common Language RunTime Support: /clr

このdllを使用したいC#プロジェクトもそのように設定されていた(同じプロパティがに設定されていた/clr)ためです。


ソリューションエクスプローラー>プロパティ>構成プロパティ
Yuresh Karunanayake

@gumuruh「clrとは」という意味の場合、CLRはdocs.microsoft.com/en-us/dotnet/standard/clr
LoukMouk

0

私も同様の問題に直面しました。.NET 2.0 DLLの参照を.NET 1.1プロジェクトに追加しようとしました。.Net 1.1でコンパイルされた.dllの以前のバージョンを追加しようとしたとき。それは私のために働いた。


0

この問題のヘルプを探している人、またはFileNotFoundExceptionまたはFirstChanceExceptionが発生している人は、ここで私の答えを確認してください。

タイプ 'System.IO.FileNotFoundException'の最初のチャンス例外がmscorlib.ni.dllで発生しました-Windows Phone

一般に、参照を作成するためのすべての要件を満たしていることを完全に確信している必要があります。これは明らかな答えですが、比較的単純な要件を見落としている可能性があります。


参照との関連でフレームワークバージョン間の違いを確認してください。新しいフレームワークバージョンを使用しても多くの場合、違いはありません。
JHaps

0

Windowsサービスの作成中にこのエラーが発生しました。Visual Studioを管理者として実行していたため、ビルド後のコマンドでサービスが自動的にインストールされました。すべてを閉じてVSを通常どおり(管理者としてではなく)実行すると、エラーなしで正常に参照を追加できることに気付きました。

このソリューションがうまくいくことを願っています。


0

通常、Visual Studio 2015では、Visual StudioのテンプレートからC ++-> CLRプロジェクトとしてdllプロジェクトを作成する必要がありますが、事実上、それを技術的に有効にすることができます。

重要なプロパティはCommon Language Runtime Support、プロジェクトの構成でセットと呼ばれます。下にありConfiguration Properties > General > Common Language Runtime Supportます。

これを行うとき、VSはおそらく 'Target .NET Framework'オプションを更新しません(必要に応じて)。これを手動で追加するには、プロジェクトをアンロードし、your_project.xxprojファイルを編集して、Target .NET framework VersionXMLタグを追加/更新します。

サンプルについては、C ++ CLRプロジェクトとして新しいソリューションを作成し、そこでXMLを調査することをお勧めします。おそらく、それを比較して、通常とは異なる非常に重要なものがないことを確認します。


0

私の答えは少し遅いですが、簡単なテストとして、最新バージョンのライブラリを使用していることを確認してください。

私の場合、問題を引き起こしている別のライブラリを参照しているnugetライブラリを更新した後、問題は消えました。


0

.dllファイルを手動で追加できます。たとえば、WPFアプリケーションにdllファイルを追加したいが、プロジェクトでそれを参照できない場合

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

次に、そのDLLファイルをコピーし、INSTALLER PROJECT(アプリケーションフォルダ内)に貼り付けます。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.