2013-12-09 6 views
0

Я создал файл DLL с помощью C# Utils.dll которые функционируют содержание строку_замены в классе StringUtils. Функция успешно вызывается и дает результат при вызове в консольном приложении. Теперь я включил DLL-файл в папку plugins/ansi в NSIS.Вызов функции внешней библиотеки DLL в NSIS

Я пытался вызвать функцию как:

Utils.StringUtils::replace_string "E:\\test\\test.txt" 'abcd' 'efgh' 

Я также попытался с помощью CLR

CLR::Call /NOUNLOAD Utils.dll Utils.StringUtils replace_string 3 "E:\\test\\test.txt" 'abcd' 'efgh' 

И снова с системой вызова

System::Call 'Utils::StringUtils.replace_string("E:\\test\\test.txt", "abcd", "efgh");' 

Но я получил ошибки в то время как компиляция файла nsi. Какова может быть правильная реализация функции в DLL-файле в NSIS?

C# Код:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Text.RegularExpressions; 
    using System.IO; 


    namespace Utils 
    { 
     public class StringUtils 
     { 

      public StringUtils() 
      { 
      } 
      /// 
      /// Replace the data in the Huge files searching and replacing chunk   
      /// by chunk. It will create new file as filepath + ".tmp" file with   
      /// replaced data   
      /// 
      /// Path of the file 
      /// Text to be replaced 
      /// Text with which it is replaced   
      public static void replace_string(string filePath, string replaceText, string withText) 
      { 
       StreamReader streamReader = new StreamReader(filePath); 
       StreamWriter streamWriter = new StreamWriter(filePath + ".tmp"); 

       while (!streamReader.EndOfStream) 
       { 
        string data = streamReader.ReadLine(); 
        data = data.Replace(replaceText, withText); 

        data = Regex.Replace(data, replaceText, withText); 

        streamWriter.WriteLine(data); 
       } 

       streamReader.Close(); 
       streamWriter.Close(); 
      } 

      public static void print_text() 
      { 
       Console.WriteLine("test"); 
       Console.ReadKey(); 
      } 
     } 
    } 

Программа консольного приложения:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using Utils; 

    namespace ConsoleApplication1 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       StringUtils.replace_string("E:\\test\\test.txt", "abcd", "efgh"); 

       //Class1.print_text(); 
      } 
     } 
    } 

Здесь я назвал функцию строку_замены из консольного приложения и успешно выполняется, и дать правильный результат, где, как при вызове в NSIS выводит ошибку.

+0

система: : Звонок знает только о простых функциях C/Win32 ... – Anders

+0

Как насчет второго примера использования CLR для меня не работает тогда ... – NavaStha

+1

Просто сказать, что это не работает, не помогает, нам нужно знать сообщения об ошибках компилятора и т. Д. ... – Anders

ответ

0

Сам NSIS может выполнять только C dll. Но, возможно, этот плагин поможет вам:

http://nsis.sourceforge.net/Call_.NET_DLL_methods_plug-in

+0

Я пробовал по адресу, который вы отправили, включая clr.dll в плагинах, но это не сработало для меня. – NavaStha

+0

Можете ли вы быть более точным? Каким образом это не сработало? Вы получили сообщение об ошибке при компиляции (и какой ошибке) или во время выполнения? –

+0

У меня ошибка при выполнении. – NavaStha

0

КИ, я увидел реальную проблему:

Среды CLR PlugIn построена с .NET Framework 2.0. В этой версии невозможно запустить библиотеки, созданные с новыми версиями .NET Framework. В коде C# у вас есть (ненужная) строка using System.Linq;, поэтому ваша библиотека .NET построена с версии 3.5 или выше.

Вы можете обеспечить, чтобы скомпилировать библиотеку с версией 2.0 с этой командной строки вызова (адаптировать имена файлов для вашей среды):

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc /t:library /out:Utils.dll Utils.cs 

Если вы используете Visual Studio, вы можете выбрать Framework в варианты проекта.

Если вам нужно использовать библиотеку с версией .NET версии более поздней версии 2.0, вы можете перекомпилировать плагин CLR. Исходный код и файл proejct включены в Zip-файл.


Здесь старые идеи, которые вы все равно должны заботиться о:

По вашему C# кодекса некоторые вещи могут пойти не так, там есть теперь обработка ошибок/исключение сделано.

Некоторые из проблем, которые могут закончиться в виде исключения являются:

  • файл не доступен
  • нет доступа к файлу
  • нет прав для создания файла .tmp

Другой Вопрос:

Вызывает ли вторая функция «print_text()» из работы NSIS или бросает t он же исключение?

Вызов это таким образом:

CLR::Call /NOUNLOAD Utils.dll Utils.StringUtils print_text 0 

И третья вещь: В NSIS вы не должны удвоить \ в строке, так что ваш вызов будет

CLR::Call /NOUNLOAD Utils.dll Utils.StringUtils replace_string 3 "E:\test\test.txt" 'abcd' 'efgh' 
+0

спасибо за ур ответ. Ну, я также приложил консольную прикладную программу, где я вызвал эту функцию. Когда программа выполняется, это приводит к успеху с правильным выходом. Это означает, что файл доступен, доступ к файлу, прямо для создания .tml-файла. Я думаю, что в определении функции не должно быть недостатков, но невозможно понять это. – NavaStha

+0

@NavaStha Обновлен мой ответ с проверенным решением. –

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