SORU
12 Ocak 2012, PERŞEMBE


Nasıl zamanında [c#] bir yol belirtebilir miyim?

Aslında, benim C almak istiyorum (çalışma) C DLL var# projesi işlevleri çağırmak için.

Ben DLL dosyasını tam yolunu belirtmek ne zaman çalışır :

string str = "C:\\Users\\userName\\AppData\\Local\\myLibFolder\\myDLL.dll";
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);

Sorun olacak yüklenebilir bir proje, bu yüzden kullanıcı klasörü olmayacak aynı (örn : pierre, paul, jack, anne, baba, ...) göre Bilgisayar/oturum nerede olurdu herkes zindanlara koşarken.

Benim kod biraz daha genel, bu gibi olmak istiyorum :

/* 
goes right to the temp folder of the user 
    "C:\\Users\\userName\\AppData\\Local\\temp"
then go to parent folder
    "C:\\Users\\userName\\AppData\\Local"
and finally go to the DLL's folder
    "C:\\Users\\userName\\AppData\\Local\\temp\\myLibFolder"
*/

string str = Path.GetTempPath()   "..\\myLibFolder\\myDLL.dll"; 
[DllImport(str, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLFunction(int Number1, int Number2);

Büyük anlaşma "C #" arzu "sabit dize" DLL dizini için parametre.

Yani sorum şu::: Bu durumda ne yapılabilir ?

CEVAP
14 Ocak 2012, CUMARTESİ


Diğer cevapları DllImport özniteliğini kullanarak bazı öneriler aksine hala doğru yaklaşımdır.

Gerçekten dünyadaki herkes gibi yapıp belirtebilirsiniz anlamıyorumgöreceliDLL dosyası yolu. Evet, hangi uygulama yüklenecek yolu farklı insanların bilgisayarlarda farklıdır, ama bu dağıtım gelince temelde evrensel bir kural. DllImport mekanizması bu düşünceyle tasarlanmıştır.

Aslında, kolları bile DllImport değil. Yerel win 32 DLL şeyler, kullanışlı yönetilen sarma (marshaller Çağırmak/P sadece LoadLibrary çağrı) kullanarak konum ne olursa olsun, yöneten kuralları yükleniyor. Bu kuralları here, ama önemli olan burada büyük bölümünden ayrıntılı olarak sayılmıştır.

Sistem DLL için aramadan önce, aşağıdakileri kontrol eder:

  • Eğer aynı modül adı ile bir DLL bellekte zaten yüklü ise, sistem yüklenen DLL ülke olursa olsun kullanır. Sistem DLL için aramaz.
  • Eğer DLL listede bilinen DLL için Windows sürümünü hangi uygulama çalışıyor, sistemi kullanır kopyanın bilinen DLL (ve bilinen DLL bağımlı DLL, eğer herhangi bir). Sistem DLL için aramaz.

Eğer SafeDllSearchMode (varsayılan) etkinleştirilirse, arama sırası aşağıdaki gibidir:

  1. Bu uygulama yüklendi dizin.
  2. Sistem dizini. GetSystemDirectory işlevi bu dizinin yolunu almak için kullanabilirsiniz.
  3. 16-bit sistem dizini. Bu dizinin yolunu alır işlevi yok, ama aransın.
  4. Windows dizin. GetWindowsDirectory işlevi bu dizinin yolunu almak için kullanabilirsiniz.
  5. Geçerli dizin.
  6. PATH çevre listelenen dizinleri değişken. Bu her uygulama yolu Uygulama Yolları kayıt defteri anahtarı tarafından belirtilen içermediğine dikkat edin. Uygulama Yolları anahtarı DLL arama yolu hesaplarken kullanılır.

Yani, eğer sen adlandırma DLL aynı şey gibi DLL (yapmanız gereken belli değil gibi davranıyor, asla, hiçbir koşul altında, varsayılan arama emri başlayacak görünümlü dizinden uygulama yüklenmiş. Eğer DLL var sırasında yer yüklerseniz, bulunacaktır. Karmaşık sorunlar ise göreceli yollar kullanırsanız git.

Sadece yazmak:

[DllImport("MyAppDll.dll")] // relative path; just give the DLL's name
static extern bool MyGreatFunction(int myFirstParam, int mySecondParam);

Ama eğeryoksebebi ne olursa olsun çalışma ve uygulama için DLL farklı bir dizine bakmak için zorlamak gerekir, varsayılan arama yolu SetDllDirectory function kullanarak değiştirebilirsiniz.
Unutmayın, belgelerine göre:

SetDllDirectory standart DLL arama yolu arıyor sonra:

  1. Bu uygulama yüklendi dizin.
  2. Dizin lpPathName parametresi tarafından belirtilen.
  3. Sistem dizini. GetSystemDirectory işlevi bu dizinin yolunu almak için kullanabilirsiniz.
  4. 16-bit sistem dizini. Bu dizinin yolunu alır işlevi yok, ama aransın.
  5. Windows dizin. GetWindowsDirectory işlevi bu dizinin yolunu almak için kullanabilirsiniz.
  6. PATH çevre listelenen dizinleri değişken.

Bu işlevi ilk kez DLL ithal aramadan önce bu işlev çağrısı sürece, varsayılan arama yolunu DLL bulmak için kullanılan değiştirebilirsiniz. Yarar tabii, bir geçiş olabilirdinamikbu fonksiyon için değer çalışma zamanında hesaplanır. O değil, mümkün olduğunca DllImport öznitelik, sen hala bir göreli yol (adının DLL), güveniyor ve yeni bir arama emri için bulmak için.

Bu fonksiyonu P Çağırmak gerekecek. Bildirgesi bu gibi görünüyor:

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MrExcite96

    MrExcite96

    17 ŞUBAT 2011
  • sonia989

    sonia989

    26 EKİM 2006
  • SPBedition

    SPBedition

    24 HAZİRAN 2013