Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить параметр, J# 
:(
    Опции темы
DimaKGZ
Дата 4.9.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



Здравствуйте!

У меня такая проблема

Есть некая библиотека на с

Код


TEST_API int fnTest(int *t)
{
  *t = 10;
  return 42;
}



на С# вызываю процедуру так

Код


[DllImport("test")]
private static extern int fnTest(out int a);
[STAThread]
static void Main(string[] args)
{
  int a = 0;
  fnTest(out a);
}


теперь мне надо все это написать на J#

Код

/**@attribute DllImport("test")*/
private static native int fnTest(Integer a);
    
/** @attribute System.STAThread() */
public static void main(String[] args)
{        
  Integer a = new Integer(0);
  fnTest(a);    
}

и у меня появляется сообщение об ошибке

An unhandled exception of type 'System.Runtime.InteropServices.MarshalDirectiveException' occurred in ConsoleApplication1.exe

Additional information: Can not marshal parameter #1: The type definition of this type has no layout information.

нет на j# волшебного OUT smile

что делать??

PM MAIL   Вверх
mr.DUDA
Дата 4.9.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Дело в том, что J# - суть враппер над Java. Поэтому все возможности языка соответствуют возможностям Java. Если там нет поддержки указателей (ссылок), то нельзя будет написать метод, принимающий аргумент-указатель. И наоборот. Советую задать вопрос в разделе по Java: "Возможно ли использование Си-указателей в JAVA ?", с подробным описанием проблемы, только без ссылок на .NET smile.


--------------------
user posted image
PM MAIL WWW   Вверх
DimaKGZ
Дата 5.9.2005, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



К сожалению JAVA позволяет передавать параметры только по значению smile

Если нужно получить несколько значений то приходится извращаться и возвращать или в массиве или в классе - обертке.

Но тут .NET ... думал может с помощью хитро приложенного маршалинга можно это реализовать..
поэтому вопрос и был в .net раздел.

Си библиотеку переписывать нежелательно.. А заставить работать с J# нужно

PM MAIL   Вверх
Domestic Cat
Дата 5.9.2005, 06:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

Репутация: 9
Всего: 172



Я J# не знаю, но разве не должно работать что-то вроде
Код

public static void main(string[] args)
{
  int a = 0;
  a = fnTest(a);
}

?


--------------------

PM   Вверх
DimaKGZ
Дата 5.9.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



да таким образом можно ПЕРЕДАТЬ значение по ссылке

Код

TEST_API int fnTest(int *t)
{
  print(t) // распечатает 10
  return 42;
}



Код

public static void main(string[] args)
{
  int a = 10;
  a = fnTest(a);
}


а вот вернуть знаечение не получается.. smile

PM MAIL   Вверх
mr.DUDA
Дата 5.9.2005, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Раз используется .NET, можно обойти проблему следующим образом. Написать на C# класс-обёртку:

Код
using System;
using System.Runtime.InteropServices;

namespace ClassLibrary1
{
    public class MyWrapper
    {
        [DllImport("Win32Dll")]
        private static extern int fnTest(out int a);

        public static int[] FnTest()
        {
            int [] result = {0,0};
            result[0] = fnTest(out result[1]);
            return result;
        }
    }
}


Скомпилировав, получаем assembly, которую можно по reference включить в проект на J#. Дальше всё понятно:

Код
public static void main(String[] args)
{
    int[] result = ClassLibrary1.MyWrapper.FnTest();
}


Вот тестовый проект, проверял под отладкой - работает:

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  TestProj.zip 9,72 Kb


--------------------
user posted image
PM MAIL WWW   Вверх
DimaKGZ
Дата 5.9.2005, 07:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



Большое спасибо smile

Первоначально проект так и выглядел smile smile

Была обертка на с#..

Заказчик захотел избавиться от обертки и портировать код с# на J ..
Уговоры и убеждения не помогли.. Хозяин барин..

буду дальше копаться..

Спасибо
PM MAIL   Вверх
mr.DUDA
Дата 5.9.2005, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Так портируй весь код на J#, кроме обёртки для вызова native методов. Заказчику наверное важней получить хоть какой-то порт под Java, чем кол-во получаемых DLL.


--------------------
user posted image
PM MAIL WWW   Вверх
DimaKGZ
Дата 6.9.2005, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



smile

Есть просто большой проект на J#.

он "общался" с библиотеками на с++ через обертки на C# .

и вот товарищ уважаемый заказчик захотел избавиться от оберток (этот вопрос к нему - зачем?).

Вот результаты моих изысканий - на J# нельзя получить параметры (см. первый пост). Кто научит как это можно сделать

перед тем "сниму шляпу"... мне это не удалось smile

переписал библиотеки сишные заточив их вызовы под java


PM MAIL   Вверх
Дрон
Дата 10.9.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 92



Цитата(DimaKGZ @ 6.9.2005, 10:41)
переписал библиотеки сишные заточив их вызовы под java

Т.е. тема уже не актуальна?

Если же всё-таки интересно, то вот то, что я накопал:
Код

import System.*;
import System.Runtime.InteropServices.*;

public class Class1
{

/**@attribute DllImport("test")*/
private static native int fnTest(/**@attribute OutAttribute()*/Integer a);

...
}


Проверить я не могу, ибо в J# не силён. Но оно, как минимум, компилируется smile

Это сообщение отредактировал(а) Дрон - 10.9.2005, 23:11


--------------------
Да. Именно так.
PM   Вверх
Дрон
Дата 10.9.2005, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 92



Хмм... Проверил. Тот же эксепшен.
Зато нашёл другое решение. Работает на ура.
Код

import System.*;
import System.Runtime.InteropServices.*;

public class Class1
{
   /**@attribute DllImport("Win32Dll")*/
   private static native int fnTest(IntPtr addr);

   public static void main(String[] args)
   {
      IntPtr addr = Marshal.AllocHGlobal(4);
      fnTest(addr);
      Integer val = new Integer(Marshal.ReadInt32(addr));
      Marshal.FreeHGlobal(addr);

      
      Console.WriteLine("{0}",val);
   }
}



--------------------
Да. Именно так.
PM   Вверх
DimaKGZ
Дата 20.9.2005, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2004

Репутация: 1
Всего: 1



Во истину - кто ищет тот найдет..

выражаю своё уважение тов. Дрону..

действительно работает..

private static native int fnTest(/**@attribute OutAttribute()*/Integer a); - такое видел у Майкрософта в примерах.. только там

все относилось к 2005 студии.. у меня в 2003 не работало.. может это баг мелких что атрибут не работает... быть может

новый фреймворк уже умеет это делать smile .. кто знает...

спасибо.. находка интересная..
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0914 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.