У меня есть программа, которая встроена в C ++, которая содержит модули в C #, я написал интерфейс на C # и настроил его для связи с помощью взаимодействия COM, мне нужно запустить VS от имени администратора для его сборки. Однако большая проблема в том, что я не могу заставить его работать на новом ПК. Он падает, как только DLL вызывается в первый раз. Я сделал пример приложения для запуска в C #, и он возвращает файл не найден, я предполагаю, что он не может найти зарегистрированную сборку. Я создал скрипт powershell, чтобы установить его с помощью regasm. Ключи отображаются в реестре и совпадают GUID.
function Register-DLL
{
$path = $Host.UI.RawUI.WindowTitle -replace 'installDLL.ps1','';
$registerExe = $([System.Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()) + "regasm.exe"
$path += "\TcpSocketManager.dll"
$args = "/tlb /codebase"
if (-Not($registerExe.Contains(":")))
{
Write-Host $registerExe
Write-Host "Need to install .Net Framework\n"
$url = "https://www.microsoft.com/en-us/download/details.aspx?id=49981"
$IE=new-object -com internetexplorer.application
$IE.navigate2($url)
$IE.visible=$true
Write-Host -NoNewLine '\n\nPress any key to continue...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');
Register-MlxDLL
exit
}
Start-Sleep -s 1
& $registerExe $path $args
Start-Sleep -s 3
}
$myWindowsID=[System.Security.Principal.WindowsIdentity]::GetCurrent()
$myWindowsPrincipal=new-object System.Security.Principal.WindowsPrincipal($myWindowsID)
$adminRole=[System.Security.Principal.WindowsBuiltInRole]::Administrator
if ($myWindowsPrincipal.IsInRole($adminRole))
{
Set-ExecutionPolicy Unrestricted
$Host.UI.RawUI.WindowTitle = $myInvocation.MyCommand.Definition
Register-DLL
clear-host
}
else
{
$newProcess = new-object System.Diagnostics.ProcessStartInfo "PowerShell";
$path = $myInvocation.MyCommand.Definition -replace 'installDLL.ps1','';
$newProcess.Arguments = $myInvocation.MyCommand.Definition, " -Command 'cd $path'";
$newProcess.Verb = "runas";
[System.Diagnostics.Process]::Start($newProcess);
exit
}
Есть ли способ заставить приложение C ++ зарегистрировать COM при запуске, чтобы приложение могло быть переносимым?