是否可以使用 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();