如何在PowerShell的C#代码段中添加Microsoft.SqlServer.Smo程序集引用
解决C#代码段中引用SQL Server SMO程序集的问题
问题根源
直接执行New-Object Microsoft.SqlServer.Management.Smo.Server能正常运行,是因为PowerShell会自动解析并加载SMO(SQL Server管理对象)相关的依赖程序集;但使用Add-Type编译嵌入的C#代码时,PowerShell不会自动加载这些外部依赖,必须手动指定。此外你的C#代码存在一个基础错误:Microsoft.SqlServer.Management.Smo.Server是类而非命名空间,正确的命名空间引用应为Microsoft.SqlServer.Management.Smo。
解决步骤
- 修正命名空间引用:将C#代码中的
using Microsoft.SqlServer.Management.Smo.Server;改为using Microsoft.SqlServer.Management.Smo;,同时添加using System.Linq;用于日志文件大小的求和计算。 - 手动指定依赖程序集:在
Add-Type命令中通过-AssemblyName参数明确指定SMO相关程序集,至少需要Microsoft.SqlServer.Smo和Microsoft.SqlServer.ConnectionInfo(后者是SQL Server连接的基础依赖)。
修改后的完整脚本
$code = @" using System; using System.Collections.Generic; using System.Linq; using Microsoft.SqlServer.Management.Smo; namespace DatabaseInfoRetrieval { public class DatabaseInfo { public string DbName { get; set; } public bool Encrypted { get; set; } public double DbSize { get; set; } public double LogSize { get; set; } } public class DatabaseInfoRetriever { public static List<DatabaseInfo> GetDatabaseInfo(string serverInstance) { List<DatabaseInfo> databaseList = new List<DatabaseInfo>(); Server srv = new Server(serverInstance); foreach (Database db in srv.Databases) { if (!db.IsSystemObject) { DatabaseInfo info = new DatabaseInfo { DbName = db.Name, Encrypted = db.EncryptionEnabled, DbSize = db.DataSpaceUsage / (1024.0 * 1024.0), LogSize = db.LogFiles.Sum(f => f.Size) / (1024.0 * 1024.0) }; databaseList.Add(info); } } return databaseList; } } } "@ try { // 加载C#代码时指定SMO依赖程序集 Add-Type -TypeDefinition $code -Language CSharp -AssemblyName Microsoft.SqlServer.Smo, Microsoft.SqlServer.ConnectionInfo $sourcecomputer = "s-sql-p063-17.ads.schwarz" $table = @{ result = "" definition = "DB-Migration, get DBs from SQL Instance: $sourcecomputer" } // 调用静态方法,无需实例化类 $databaseList = [DatabaseInfoRetrieval.DatabaseInfoRetriever]::GetDatabaseInfo($sourcecomputer) $table.result = $databaseList ConvertTo-Json -Depth 3 -InputObject $table } catch { $table.result = "Error." $table.errors = $Error[0].Exception.Message ConvertTo-Json -InputObject $table }
额外说明
- 原脚本中
$db = New-Object -TypeName DatabaseInfoRetriever属于冗余代码,因为调用的是静态方法,无需实例化类,已删除。 - 修正了日志大小计算逻辑:
db.LogFiles是集合对象,需通过Sum方法计算所有日志文件的总大小,因此添加了System.Linq命名空间引用。
内容的提问来源于stack exchange,提问作者Purclot
相关产品推荐
相关产品推荐

