162

次の PowerShell コード

#Get a server object which corresponds to the default instance
$srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
... rest of the script ...

次のエラー メッセージが表示されます。

New-Object : Cannot find type [Microsoft.SqlServer.Management.SMO.Server]: make sure 
the assembly containing this type is loaded.
At C:\Users\sortelyn\ ... \tools\sql_express_backup\backup.ps1:6  char:8
+ $srv = New-Object -TypeName Microsoft.SqlServer.Management.SMO.Server
+        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : InvalidType: (:) [New-Object], PSArgumentException
+ FullyQualifiedErrorId : TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand

インターネット上のすべての回答は、アセンブリをロードする必要があると書いています-エラーメッセージからそれを読むことができます:-)-質問は次のとおりです。

アセンブリをロードしてスクリプトを機能させるにはどうすればよいですか?

4

11 に答える 11

189

LoadWithPartialName廃止されました。PowerShell V3 の推奨される解決策は、Add-Typeコマンドレットを使用することです。

Add-Type -Path 'C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies\Microsoft.SqlServer.Smo.dll'

複数の異なるバージョンがあり、特定のバージョンを選択することができます。:-)

于 2012-10-16T22:11:44.477 に答える
78
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
于 2012-10-16T20:43:48.407 に答える
26

PowerShell セッション中にロックせずにアセンブリをロードする場合は、次を使用します。

$bytes = [System.IO.File]::ReadAllBytes($storageAssemblyPath)
[System.Reflection.Assembly]::Load($bytes)

$storageAssemblyPathアセンブリのファイル パスはどこにありますか。

これは、セッション内のリソースをクリーンアップする必要がある場合に特に役立ちます。たとえば、展開スクリプトで。

于 2016-05-26T18:23:42.300 に答える
16

PowerShell v1、v2、および v3 でアセンブリを読み込む方法の例を多数掲載したブログ投稿を次に示します。

方法は次のとおりです。

  • ソースファイルから動的に
  • アセンブリから動的に
  • 他のコード タイプ、つまり F# を使用する

v1.0 PowerShell セッションで .NET アセンブリを読み込む方法
v2.0 PowerShell スクリプトで CSharp (C#) コードを使用する 2.0
v3.0 Windows PowerShell で .NET Framework アセンブリを使用する

于 2013-03-12T09:14:06.177 に答える
14

*.dll アセンブリ全体をロードできます

$Assembly = [System.Reflection.Assembly]::LoadFrom("C:\folder\file.dll");
于 2013-03-12T13:31:35.220 に答える
2

を使用できますLoadWithPartialName。ただし、彼らが言ったように、それは非推奨です。

あなたは確かに一緒に行くことができAdd-Type、他の答えに加えて、.dllファイルのフルパスを指定したくない場合は、単に次のようにすることができます:

Add-Type -AssemblyName "Microsoft.SqlServer.Management.SMO"

SQL Server がインストールされていないため (おそらく)、エラーが返されましたが、これと同じ考えで、Windows フォーム アセンブリを読み込むことができました。

Add-Type -AssemblyName "System.Windows.Forms"

特定のクラスに属する正確なアセンブリ名は、MSDN サイトで確認できます。

特定のクラスに属するアセンブリ名を見つける例

于 2016-07-12T08:28:28.383 に答える
2

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")私のために働いた。

于 2016-04-01T12:07:44.023 に答える