استفاده از dll تولید شده در c++ واستفاده از ان در c#

swsehsan

Member
سلام
من می خوام تمام قسمت های اصلی برنامه شامل فرمول ها مهم تمام داخل c++ بنویسم (فایل dll ) و از dll ساخته شده در سی شارپ استفاده کنم
برای مثال تابع فاکتوریل در c++ نوشتم ومی خوام جواب در یک لیبل نشون بدم اما برنامه اجرا نمیشه

کد c++
PHP:
// TestDLL.cpp : Defines the exported functions for the DLL application.
//

#include "stdafx.h"
double __stdcall factorial(double num)

{
    if(num<=1)
        return 1;
    else
        return num*factorial(num-1);
}

کد فایل def

PHP:
LIBRARY "TestDLL"
EXPORTS
factorial

الان با این کد ها dll ساخته میشه

کد سی شارپ

PHP:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace UseTestDLL
{
    public partial class Form1 : Form
    {
        [DllImport("TestDLL.dll")]
        public static extern double factorial(int num);
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = factorial(15).ToString();
        }
    }
}

فایل dll هم در کنار پروژه قرار میدم
ممنون
 

پیوست ها

  • error.jpg
    error.jpg
    200.7 کیلوبایت · بازدیدها: 19

the_king

مدیرکل انجمن
سلام
من می خوام تمام قسمت های اصلی برنامه شامل فرمول ها مهم تمام داخل c++ بنویسم (فایل dll ) و از dll ساخته شده در سی شارپ استفاده کنم
برای مثال تابع فاکتوریل در c++ نوشتم ومی خوام جواب در یک لیبل نشون بدم اما برنامه اجرا نمیشه

زبان های ++C و #C تابع را از روی اسم و پارامتر های ورودی اش می شناسند، نه فقط اسم.
شما در تابع TestDLL.cpp تابعی ندارید که پارامتر ورودی اش int باشه و خروجی اش double
در نتیجه به شما اعلام می کنه که همچین تابعی وجود نداره.

کد:
        [DllImport("TestDLL.dll")]
        public static extern double factorial(int num);
 

swsehsan

Member
سلام
بله حق با شماست من اینجا اشتباه وارد کردم وپست هم ویرایش نکرده بودم من این درست کردم اما باز هم همون error داده بود

کد c++
PHP:
#include "stdafx.h"
double __stdcall factorial(double num)

{
    if(num<=1)
        return 1;
    else
        return num*factorial(num-1);
}

فایل def
PHP:
LIBRARY "TestDLL"
EXPORTS factorial

c#
PHP:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace UseTestDLL
{
    public partial class Form1 : Form
    {
        [DllImport("TestDLL.dll")]
       public static extern double factorial(double num);
        public Form1()
        {
            InitializeComponent();
        }
 
             private void button1_Click(object sender, EventArgs e)
        {
           
            double value = double.Parse(textBox1.Text);
            double result = factorial(value);
            label1.Text = result.ToString("0.####");
        }
    }
}
متن error
PHP:
Unable to find an entry point named 'factorial' in DLL 'TestDLL.dll'.
ممنون
 

the_king

مدیرکل انجمن
فایل TestDLL.dll رو در پوشه debug کپی کرده بودید؟
فراموش نکنید که در تنظیمات Build پروژه تان Platform target را روی x86 تنظیم کنید، نه Any CPU.
کامپایل پروژه شما باید همیشه 32 بیتی باشد چون دارید از یک DLL ای استفاده می کنید که 32 بیتی است.
اگر روی ویندوز 64 بیتی اجرایش کنید این مورد آشکار خواهد شد.

TestDLL.zip
 

پیوست ها

  • TestDLL.zip
    156.6 کیلوبایت · بازدیدها: 77

swsehsan

Member
سلام
بله تمام کار های بالا انجام داده بودم الان متوجه شدم که حجم فایل dll من در حالت debug بیست و هفت کیلو بایت است در حالی که مال شما در حالت دیباگ 252 kb است وقتی فایل dll به همراه فایل Incremental Linker File.ilk در کنار پروژه سی شارپ قرار دادم درست شد محاسبه کرد (من تنها فایل dll در کنار پروژه قرار میدادم ) اما فایلی که شما up کردید در کنار پروژه اصلی فقط فایل dll بود الان چکار کنم که فایل Incremental Linker File .ilk به فایل dll اضافه بشه
وقتی فایل dll خودم که 27 kb است Dumpbin میکنم چیزی نشون نمیده اما DLL شما درسته
PHP:
  ordinal hint RVA      name

        1    0 00029B45 factorial = @ILT+2880(?factorial@@YGNN@Z)

Summary

      4000 .data
      1000 .idata
     10000 .rdata
      4000 .reloc
      1000 .rsrc
     54000 .text
     28000 .textbss
ممنون
 

the_king

مدیرکل انجمن
سلام
بله تمام کار های بالا انجام داده بودم الان متوجه شدم که حجم فایل dll من در حالت debug بیست و هفت کیلو بایت است در حالی که مال شما در حالت دیباگ 252 kb است وقتی فایل dll به همراه فایل Incremental Linker File.ilk در کنار پروژه سی شارپ قرار دادم درست شد محاسبه کرد (من تنها فایل dll در کنار پروژه قرار میدادم ) اما فایلی که شما up کردید در کنار پروژه اصلی فقط فایل dll بود الان چکار کنم که فایل Incremental Linker File .ilk به فایل dll اضافه بشه
وقتی فایل dll خودم که 27 kb است Dumpbin میکنم چیزی نشون نمیده اما DLL شما درسته

روال ساختن پروژه DLL ای که من ساخته ام اینه :

Microsoft Visual C++ 6.0 ، منوی File گزینه New
زبانه Project پروژه از نوع Win32 Dynamic-Link Library
داخل پروژه در زبانه FileView روی پوشه Source Files راست کلیک کرده و Add Files To Folder
را انتخاب می کنم. نام پروژه با پسوند def را نوشته و OK می کنم.
گزینه Yes را انتخاب کرده و OK می کنم. روی اسم فایل در لیست دوبار کلیک کرده و گزینه Yes را انتخاب می کنم.
موارد EXPORTS داخلش را اضافه می کنم. بقیه موارد مشابه کد شما است. بعد از Build کردن پروژه فایل DLL مورد نظر
رو از داخل پوشه Debug اش کپی کرده و در پوشه bin\Debug پروژه #C ام Paste می کنم.
 

جدیدترین ارسال ها

بالا