2017-01-12 1 views
0

У меня есть проект C#, который вызывает C++ CLI через DLL. Он возвращает строку в C#, которая отображается в текстовом поле в событии кнопки. Я добавил эту dll (с именем MyDll.dll), добавив ее в качестве ссылки в мои свойства проекта C#. Я пытаюсь создать установщик с помощью набора инструментов wix. Вот исходный код.C# с проектом CLI EXE, установленный через установщик WIX, не работает

C# Код

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

using MyDll; 

namespace MyProject 
{ 
    public partial class Form1 : Form 
    { 
     public Class1 obj = new Class1(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      string str = ""; 
      string str_new = obj.MyFunc(str); 

      textBox1.Text = str_new; 
     } 
    } 
} 

C++ CLI код

#include "stdafx.h" 

#include "MyDll.h" 

namespace MyDll 
{ 
    Class1::Class1(){} 
    Class1::~Class1(){} 
    Class1::!Class1(){} 

    String^ Class1::MyFunc([Out] String^ str) 
    { 
     str = "My C++/Cli DLL"; 
     return outVal = str; 
    } 
} 

CLI C++ Header

// MyDll.h 

#pragma once 

using namespace System; 
using namespace System::Runtime::InteropServices; 

namespace MyDll { 

    public ref class Class1 
    { 
     // TODO: Add your methods for this class here. 
    public: 
     Class1::Class1(); 
     Class1::~Class1(); 
     Class1::!Class1(); 

     String^ MyFunc([Out] String^ str); 

     String^ outVal; 
    }; 
} 

Мои WXS Файл

<?xml version="1.0" encoding="UTF-8"?> 
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> 
    <Product Id="*" Name="installer_test" Language="1033" Version="1.0.0.0" Manufacturer="Company" UpgradeCode="a928c48a-8e5b-4038-b871-939ff8a9349f"> 
     <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" /> 

     <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." /> 
     <MediaTemplate /> 

     <Feature Id="ProductFeature" Title="installer_test" Level="1"> 
      <ComponentGroupRef Id="ProductComponents" /> 
     </Feature> 
    </Product> 

    <Fragment> 
    <Property Id="ROOTDRIVE"> 
     <![CDATA[E:\]]> 
    </Property> 
    <Directory Id="TARGETDIR" Name="SourceDir"> 
     <Directory Id="ProgramFiles" Name="ProgramFiles"> 
     <Directory Id="TopFolder" Name="EXE3"> 
      <Directory Id="INSTALLFOLDER" Name="Main folder"> 
      <Component Id="cmpMain" Guid="{0509AAED-64A8-43F6-8935-70FB12305189}" KeyPath="yes" Feature="ProductFeature"> 
       <File Source="$(var.MyProject.TargetPath)" /> 
       <File Source="$(var.MyProject.TargetPath)" Name="MyDll.dll" ShortName="AF" /> 
      </Component> 


      </Directory> 
     </Directory> 
     </Directory> 
    </Directory> 
    <Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER"></Property> 
    <UIRef Id="WixUI_InstallDir"/> 
    </Fragment> 
    <Fragment> 
     <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER"> 
      <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --> 
      <!-- <Component Id="ProductComponent"> --> 
     <!-- <File Source="$(var.MyProject.TargetPath)"/>--> 
     <!-- TODO: Insert files, registry keys, and other resources here. --> 
     <!-- </Component> --> 



    </ComponentGroup> 
    </Fragment> 
</Wix> 

Мой инсталлятор работает отлично. Он устанавливает exe и dll (MyDll.dll) с указанным путем. Но когда я запускаю exe, он ничего не делает. Если я заменил установленный exe на exe, который создается в папке bin моего проекта C#, тогда он отлично работает. Как я могу решить эту проблему?

Благодаря

ответ

1

Ошибка лежит в этих 2-х линий:

  <File Source="$(var.MyProject.TargetPath)" /> 
      <File Source="$(var.MyProject.TargetPath)" Name="MyDll.dll" ShortName="AF" /> 

если $(var.MyProject.TargetPath) ваш файл EXE, то вы устанавливаете его в два раза, второй раз просто называя его MyDLL.dll. Никакая оригинальная dll не установлена.

Сделать это как

<File Source="$(var.MyProject.TargetPathExe)" /> 
<File Source="$(var.MyProject.TargetPathDll)" /> 

где переменные содержат пути к исходный ехе и файл DLL.

Смежные вопросы