C # içinde kullanılacak bir DLL nasıl oluşturulur

Win CE çalıştıran ICOP VDX-6354 kartım var. C# programımdan panonun zilini kontrol etmeye çalışıyorum. Ben tüm playsound vb "coredll.dll" platformu çağırdı denedim. bunların hiçbiri şimdiye kadar işe yaramadı. Bu yüzden son şansım kendi DLL'mi oluşturmak.

unsigned char inp(short addr)
{
    unsigned char cValue;
    _asm
    {
        mov dx, addr
        in ax, dx
        mov cValue, al
    }
    return cValue;
}
void outp(int addr, unsigned char val)
{
     __asm
    {
        push edx
        mov edx, DWORD PTR addr
        mov al, BYTE PTR val
        out dx, al
        pop edx
    }
}
bool MyBeep(DWORD dwFreq, DWORD dwDuration)
{
    outp(0x43, 0xb6);//Set Buzzer
    outp(0x42, (0x1234dc/dwFreq));//Frequency LSB
    outp(0x42, (0x1234dc/dwFreq) >> 8);//Frequency MSB
    outp(0x61, inp(0x61) | 0x3);//Start beep
    Sleep(dwDuration);
    outp(0x61, inp(0x61) & 0xfc);//End beep
    return TRUE;
}

Yukarıdaki kod, kartın veri sayfasında mevcuttur. Ben bir DLL olarak derlemek istiyorum sonra C# programında gibi çağırmak istiyorum

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")]
public static extern void MyBeep(uint dwFreq, uint dwDuration);

Derlediğimde aşağıdaki gibi bir önek kullandım:

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration)

Böylece umarım zili kontrol edebilirim. Benim sorunum, onu derlerken başarılı olamam. buradaki adımları izledim ancak bana yardımcı olmadı.

Adım adım ne yapmalıyım?

DÜZENLE:

Ben DLL yaptım düşünüyorum. DLL burada bulunan başka bir yol denedim.

Şimdi, DLL C# başlangıç ​​projenin Debug klasörüne kopyaladım (Projenin diğer dll dosyaları da bu klasörde). Sonra MyBeep.DLL MyBeep.DLL benim C# projemde çağırmaya çalışıyorum:

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")]
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration);

Ancak aşağıdaki istisnaları veriyor.

PInvoke DLL 'MyBeep.dll' bulunamıyor.

Bir şey mi eksik? Yukarıda yaptığım bağlantıları kontrol etmek için DLL'yi almamı istediğim yukarıdaki bağlantıları kontrol edin. Saygılarımızla.

9
Hangi derleyici ve platform?
katma yazar flipchart, kaynak
Hata ayıklama için bir dll başlatamazsınız (barındırmak için bir exe olmadan). "Çal" (örneğin, Debug) düğmesine basmak yerine, "Hata ayıklama olmadan derleme" komutunu bulun.
katma yazar Sam Axe, kaynak
Uhm, hayır. Bu, sahip olduğum kadar açık. İyi şanslar.
katma yazar Sam Axe, kaynak
Ne başarısız oldu? Hata mesajları? Nasıl inşa ettin? Kısacası, daha fazla detay lütfen.
katma yazar David Heffernan, kaynak
+1 çok gerçek bir soru gibi görünüyor, neden birisinin kapanmaya oy verdiğinden emin değil.
katma yazar Chris Marisic, kaynak
@ OğuzSezer - Eğer yardım istiyorsanız, sağlanan derleyiciyi yazınız. Harika bir ilk başlangıç, bir uygulama olmayan bir şeyleri ayıklamaya çalışmaktan vazgeçmek olurdu. Daha fazla bilgiye ihtiyacımız var ... ... bu soruya cevap verilemez.
katma yazar Security Hound, kaynak
@ Oğuz Sezer - Eğer uygulama dll bulamazsa o zaman doğru yerde değil. Onu nereye koyuyorsun? Neden onu kaydetmeye çalışıyorsun, bunu yapmana gerek yok, bu bir COM kütüphanesi değil.
katma yazar Security Hound, kaynak
Sadece başarılı bir şekilde derlemedi. Sorumlulukta belirttiğim gibi, adım adım "nasıl yapılır" eğitimini takip ettim. Derlemeye çalıştığımda "Hata ayıklama oturumu için yürütülebilir" sordu. Ve açılan kutudaki tek yürütülebilir dosya RegSvr32'dir. RegSvr32'yi seçip çalışmaya devam ettiğimde, kullanımın ayrı olduğunu belirten regsrv32 [/ u] [/ s] [/ n] [/ i] vb. Derler ve derleyicide herhangi bir hata oluşmaz.
katma yazar Oğuz Sezer, kaynak
Visual Studio 2005. boş C ++ projesi (uygulama türü DLL).
katma yazar Oğuz Sezer, kaynak
@Boo Daha net olabilir misiniz lütfen, bunu daha önce yapmadım.
katma yazar Oğuz Sezer, kaynak
@Ramhound VS herhangi bir hata vermez. regsrv32 uyarı ekranı açılır ve derleme durur. Uyarı açılır penceresinde kullanım şöyle der: regsrv32 [/ u] [/ s] [/ n] [/ i]. Belki birisi bunu daha önce C# içinde kullanılacak bir DLL nasıl yapılacağını söyleyebilirim
katma yazar Oğuz Sezer, kaynak
@Ramhound Ben C# başlangıç ​​projenin Debug klasörüne DLL kopyaladı (Projenin diğer DLL dosyaları da bu klasörde)
katma yazar Oğuz Sezer, kaynak

2 cevap

Elinizde iki sorun var:

  1. dll'yi oluşturmaya, denemeye ve hata ayıklamaya gerek yok. C# projenizle aynı projede bulunuyorsa, C# projesini başlangıç ​​projesi olarak ayarlayın (proje dosyasına sağ tıklayın), yoksa sadece Hata Ayıklama Başlatmak yerine Oluştur'u seçmeniz gerekir (kısayol kullanıyorsanız). Anahtarlar muhtemelen Ctrl + ÜstKrktr + B [C # ortam ayarını kullanıyorsa] veya F7 [C ++ ortam ayarını kullanıyorsanız] olacaktır.)

  2. DLL'nin doğru konumda olması gerekir. Bunu otomatikleştirmek istiyorsanız, C ++ projesine (proje özellikleri, doğru şekilde hatırlatırsam eylemler oluşturup post-build) bir post-build adımı eklemeniz yeterlidir. copy "$ (TargetPath)" gibi bir şey yapar "" $ (SolutionDir) \ csproj \ bin \ $ (ConfigurationName'ini) \ *. * "

Bu makroların bazıları biraz kapalı olabilir, ancak genel fikri almalısınız.

DÜZENLEME: Ayrıca C ++ projenizin C# projenizden önce oluşturduğundan emin olmanız gerekir. C# proje dosyanızı sağ tıklatın ve Proje Bağımlılıkları'na gidin, ardından Depends on kutusundaki C ++ kütüphanesini işaretleyin. Oluşturma adımının çalıştığından emin olmak için C ++ projesini kendi başına oluşturmayı deneyin ve bu dosyayı kontrol etmek için DLL'yi C# projenizdeki doğru dizine kopyalayın. Eğer yoksa, çıkış penceresindeki hataları işaretler. Bir DLL oluşturmak için bu eğiticiyi takip ettiyseniz, tamam olmalısınız.

1
katma
hayır, hala çalışmıyor ...
katma yazar Oğuz Sezer, kaynak

Hata mesajı aksini önerse de, dışa aktarılan işlevin adını kontrol etmelisiniz. Win32 için her zaman bu aracı kullanıyorum. CE dll için, belki DUMPBIN/EXPORTS çalışır.

Functon adı __ MyBeep olarak adlandırılacaktır: Bu önekin bir C sözleşmesi olduğuna inanıyorum.

0
katma
Windows
Windows
729 Katılımcıların

Windows ile ilgili tüm sorunların çözümüne yanıt arandığı ve paylaşımların yapıldığı bir gruptur. @SerCiTV @Tekpay @Apktanitim kanal/grupların uzantısıdır. https://t.me/joinchat/H1pwvUwqv4etCBtv9Oi_qQ