Зарегистрируйте C # DLL с помощью COM Interop при запуске приложения C ++ - PullRequest
0 голосов
/ 29 августа 2018

У меня есть программа, которая встроена в 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 при запуске, чтобы приложение могло быть переносимым?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...