2010-04-15 20 views
13

Kodumda çalışma zamanında gözlemleyebileceğim bir dizi Console.WriteLines var. Yazdığım bir yerli kütüphaneyle iletişim kurarım.sorunları?

Bazı kitapçıkları yerel kitaplığa yapıştırmak ve bunlara da bakmak istiyorum. Ancak onları çalışma zamanında göremiyorum.

Sorunumu göstermek için sarhoş bir merhaba dünya uygulaması oluşturdum. Uygulama çalıştığında, yerel kitaplığa hata ayıklayabilir ve merhaba dünyasının çağrıldığını görebilirim. Çıktı, metin yazarı olmasına rağmen asla inmez. Aynı kod bir konsol uygulaması olarak çalıştırılıyorsa, her şeyin iyi çalıştığını unutmayın.

C#:

[DllImport("native.dll")] 
    static extern void Test(); 

    StreamWriter writer; 

    public Form1() 
    { 
     InitializeComponent(); 

     writer = new StreamWriter(@"c:\output.txt"); 
     writer.AutoFlush = true; 
     System.Console.SetOut(writer); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Test(); 
    } 

ve yerli kısmı:

__declspec(dllexport) void Test() 
{ 
    printf("Hello World"); 
} 

Güncelleme: hamishmcn aşağıda ayıklama hakkında konuşmaya başladı/bırakma oluşturur. Yerel çağrıyı yukarıdaki button1_click yönteminde kaldırdım ve standart bir Console.WriteLine .net çağrısı ile değiştirdim. Bunu hata ayıklama modunda derledim ve çalıştırdığımda iletiler çıktı dosyasına yönlendirildi. Serbest bırakma moduna geçtiğimde, aramalar yeniden yönlendirilmedi. Konsol yönlendirmesi yalnızca hata ayıklama modunda çalışır gibi görünüyor. Bunu nasıl halledebilirim?

+0

Yanıt yok, ancak bu gönderi http://stackoverflow.com/questions/2570001/allow-native-dll-to-output-stdout-stderr-in-c-console-application, düzgün çalışması gerektiğini önerir. Hmm. Stdout'un başka bir yere yönlendirdiği anlaşılıyor; ya bu ya da tamponlu ediliyor. –

+1

Yerel kitaplığı nasıl başlatıyorsunuz/ekliyorsunuz? – chilltemp

+0

İşlemi vsnet üzerinden ekledim ve ayrıca konsolda çalışmasına izin verdim ve yerel stdout'tan bir şey göremiyorum. Ayrıca yerel bir şey çıkarmayan DbgView'ı da denedim, sadece .net mesajlarını. –

cevap

1

Konsol yeniden yönlendirme yalnızca hata ayıklama modunda çalışır.

1

Şu an üzerinde çalışabileceğim herhangi bir proje yok ama arabelleğe alma konusunda kesinlikle şüpheleniyorum. Hafızam bana doğru hizmet verirse stdout arabelleğe alınır. Bu satırın sonuna vurur her zaman tampon temizler:

printf("Should be flushed immediatelly\n"); 

Yoksa fflush kullanabilirsiniz temizlemek stdout:

printf("Will be buffered and then flushed"); 
fflush(stdout); 

Ayrıca setbuf kullanarak kapalı arabelleğe kapatabilirsiniz:

setbuf(stdout, NULL); 
+1

Sadece önerilerinizi denedim ama şanssız :( –

2

Belki de yerel kütüphaneniz, bir nedenle konsoldan haberi yoktur.
GetConsole numaralı telefonu arayarak bir tanıtıcının döndürülüp görülmediğine bakın. Değilse, çalışıp çalışmadığını görmek için kendi console'u tahsis etmeyi deneyebilirsiniz.
İyi şanslar! :-)


Güncelleme:
Ben Sana ne ... konsolunda görünür çok örnek bir uygulamasını (konsol C# uygulaması yerli C çağırarak ++ dll) ve C# Console.WriteLine hem de yerli printf yazdı Biz kayıp mıyız?
Her zaman hata ayıklama modunda çalıştırıyorsunuz - serbest bırakma modunda çalıştırırsanız bir konsol penceresi görüyor musunuz?
Güncelleştirme 2:
Üzgünüm, konsoldaki metni gördüğümü söylemeliyim, ancak Console çıkışını örneğinizde olduğu gibi bir StreamWriter'e ayarlarsanız, o zaman sadece WriteConsole metni çıktı dosyasına gider. printf hala konsola yazar ki (kirli ayrıntıya dikkat etmek vsnprintf üstünde) kendi printf uygulanması ekrana

+1

Sorularıma dayanarak güncellemeyi güncelledim –

+0

Ayrıca bkz. Http://stackoverflow.com/questions/432832/what-is-the-api-functions-assignconsole-ve-attachconsole-1 – abatishchev

+0

abatishchev: Bu yine başka bir rastgele işlev çağrısı. Komik olmak demek istemiyorum, ama basit printf çağrılarımda yanlış olan nedir? ilk etapta? –

0

gidin:

#include <stdarg.h> 

int printf(const char *fmt, ...) 
{ 
    char buffer[LARGESIZE]; 
    int rv; 
    va_list ap; 
    va_start(ap, fmt); 
    rv = vsnprintf(buffer, sizeof(buffer), fmt, ap); 
    va_end(ap); 

    Console.WriteLine(buffer); 

    return rv; 
} 
+0

Güzel fikir. Sadece printf() 'deme (basitçe değil). – DevSolar