Как я могу внедрить файл в EXE во время выполнения и ссылаться на файл во время работы программы? - PullRequest
6 голосов
/ 17 марта 2011

Я бы хотел, чтобы пользователь скачал exe-файл с моего сайта, где (синхронно после загрузки) XML-файл внедряется в это приложение.Этот XML-файл содержит открытый ключ и подпись.

Как внедрить файл перед загрузкой и ссылаться на него позже во время выполнения?

В идеале я не буду использовать оболочку для введения файла, скорее нативный API-интерфейс .NET.

Ответы [ 5 ]

8 голосов
/ 17 марта 2011

Вы можете легко это сделать с Mono.Cecil , вам просто нужно написать что-то вроде:

var module = ModuleDefinition.ReadModule ("Application.exe");

module.Resources.Add (
    new EmbeddedResource (
        "signature.xml",
        ManifestResourceAttributes.Private, 
        File.ReadAllBytes ("signature.xml")));

module.Write ("Application.exe",
    new WriterParameters {
        StrongNameKeyPair = new StrongNameKeyPair ("keypair.snk")
});

Чтобы добавить ресурс signature.xml из файла signature.xml и выполнить обратную сборку с помощью keypair.snk, который вы использовали для подписи Application.exe.

А во время выполнения вам просто нужно использовать:

var stream = Assembly.GetExecutingAssembly ()
    .GetManifestResourceStream ("signature.xml");

Для извлечения ресурса.

1 голос
/ 17 марта 2011

Судя по тому, что он пишет, он собирается динамически изменить файл перед загрузкой.Это действительно зависит от используемого вами серверного языка и от того, насколько вы контролируете свою учетную запись сервера / хостинг-провайдера.
Допустим, у вас есть файл download.aspx, который генерирует эти exe-файлы и отправляет их для загрузки.Одна вещь, которую вы можете сделать, это поместить исходный код сборки на ваш сервер, затем download.aspx соберет его и отправит для загрузки.(Сложный способ)
Другой способ - поместить скомпилированную сборку на сервер, а затем использовать, например, cecil ( Программно встраивать ресурсы в сборку .NET ) или что-либо еще, чтобы изменить его, а затем отправить его для загрузки.

1 голос
/ 17 марта 2011

Чтобы добавить файл, добавьте его в свой проект. Затем щелкните его правой кнопкой мыши в обозревателе решений, перейдите в свойства и измените его тип на EmbeddedResource.

Чтобы загрузить его во время выполнения, используйте Assembly.GetManifestResourceStream(). Подробнее здесь: http://msdn.microsoft.com/en-us/library/xc4235zt.aspx.

0 голосов
/ 17 марта 2011

Добавьте файл в ваш проект, обычно что-то вроде:

+solution
  +project
    +Resources
      +SomeDirectory
        -SomeFile

Затем перейдите в свойства вашего проекта, перейдите на вкладку ресурсов на левом сайте и выберите ресурс files на верхней навигационной панели. Выберите, чтобы добавить ресурс> добавить существующий файл. Перейдите к файлу, который вы только что поместили в свой проект, и выберите, чтобы добавить его.

Файл теперь будет отображаться на вкладке Ресурсы свойств вашего проекта. Измените имя вашего файла на вкладке Ресурсы, чтобы сделать его более осмысленным.

Файл теперь является встроенным ресурсом вашего проекта, и вы можете получить к нему доступ в следующем коде:

var MyFile = Properties.Resources.MyFile
0 голосов
/ 17 марта 2011

Это Результат Google кажется многообещающим.

...