我想在 SQL Server CLR 中使用 Microsoft.Web.Administration.dll 以在运行时获取特定 Web 应用程序的物理路径,但 DLL 在 SQL Server 中不可用或测试,添加它需要添加一系列依赖 DLL(也未经测试),所以基本上不要介意以上所有内容。
关于这个问题,但首先是简短的背景。我的数据库应用程序的架构非常漂亮......“Database.Values”命名空间(在 database.dll 中)包含许多 C# 类,每个类都代表“RegexConstrainedString”或“ConstrainedNumber”(两个自定义类)的子类数据库中各个字段的正则表达式和数值约束。每个类都标有指定各种表+字段名组合的属性,这些组合指示每个规则在数据库中适用于哪些表和字段名。
部署应用程序获取该 database.dll,使用反射来查找具有上述属性的类,并为每个类动态生成(在 IL 操作代码中)一个函数(类名附加“检查”),其目的只是尝试实例化一个给定带有关联类的字符串或数字,并根据实例化是否成功返回真或假。当字符串或数字与类定义的约束不匹配时,实例化失败。然后,部署应用程序使用 ILMerge.exe 将其动态生成的函数与原始 database.dll 合并,以生成一个新的 database.dll,并将其部署到 SQL Server。然后它会打开一个 GUI,允许一键创建、启用和检查所有相关的 SQL 检查约束函数,
无论如何...其中一个特别称为“文本”的类通过将 Unicode 字符串映射到 ASCII 字符串来强制对字段进行 ASCII 编码,并且为了完整起见,它将映射所有 65536 个可能的两字节(16 位)UCS2 代码点值使用由 Web 应用程序创建和编辑的字符映射到特定的 ASCII 字符。当然,我可以将范围 (32-126) 之外的所有内容都映射到一个问号字符,但是我想要更好地控制我将每个可能的 Unicode 字符映射到一个它非常相似的 ASCII 字符,所以它可能现存最完整(虽然是主观的)视觉地图之一。
问题是,位于 SQL CLR 中 database.dll 中的 Text 类的静态构造函数需要加载该 ASCII 映射文件,该文件位于特定 Web 应用程序的根目录中。我应该如何在不对其进行硬编码且无法使用 Microsoft.Web.Administration.dll 调用的情况下获得该路径(new ServerManager()).Sites["Default Web Site"].Applications["/utilities"].VirtualDirectories["/"].PhysicalPath
?