如何使用 DacServices 从 WIX 自定义操作将数据库注册为 DAC



是否可以使用 Wix 自定义操作中的 DacServices 将现有数据库注册为数据层应用程序?

我尝试通过使用DacPackage类加载DACPAC,然后将其注册到DacServices.Register方法来执行此操作。

var dacPackage = DacPackage.Load(filePath);
var dacServices = new DacServices(connectionString);
dacServices.Register(
    "databaseName",
    DacSchemaModelStorageType.File,
    "applicationName",
    new Version(1, 0, 0, 0));

当我在控制台应用程序中运行它时,代码工作正常,但在作为 WIX 自定义操作运行时则不然。相反,我收到一个带有以下消息的隔离存储异常:

无法确定域的身份

异常文档似乎表明该问题是"缺少证据"

独立存储需要证据(有关程序集及其来源的信息)才能确定代码的标识并将其连接到正确的关联文件空间。没有此信息,则无法使用独立存储。

我无法弄清楚这是什么或如何在我的场景中控制它。

堆栈跟踪很长,所以我把它放在这个粘贴箱中。

编辑:

以下是请求的 CustomAction.config 文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup useLegacyV2RuntimeActivationPolicy="true">
        <supportedRuntime version="v4.0" />
        <supportedRuntime version="v2.0.50727"/>
    </startup>
</configuration>

我在 https://github.com/wixtoolset/issues/issues/5240 上提交了关于此的错误。 您可以通过使用所需证据创建自己的 AppDomain 并在正确创建的 AppDomain 中运行代码来解决此问题。

使用此答案中的代码,此解决方法对我有用:

// This throws an IsolatedStorageException, since we haven't fixed the evidence yet.
//System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain();
// Create a new Evidence that include the MyComputer zone
var replacementEvidence = new System.Security.Policy.Evidence();
replacementEvidence.AddHostEvidence(new System.Security.Policy.Zone(System.Security.SecurityZone.MyComputer));
// Replace the current AppDomain's evidence using reflection
var currentAppDomain = System.Threading.Thread.GetDomain();
var securityIdentityField = currentAppDomain.GetType().GetField("_SecurityIdentity", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
securityIdentityField.SetValue(currentAppDomain,replacementEvidence);
// Now it works.
System.IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForDomain();

相关内容

  • 没有找到相关文章

最新更新