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
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:
- Bu uygulama yüklendi dizin.
- Sistem dizini.
GetSystemDirectory
işlevi bu dizinin yolunu almak için kullanabilirsiniz.- 16-bit sistem dizini. Bu dizinin yolunu alır işlevi yok, ama aransın.
- Windows dizin.
GetWindowsDirectory
işlevi bu dizinin yolunu almak için kullanabilirsiniz.- Geçerli dizin.
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:
- Bu uygulama yüklendi dizin.
- Dizin
lpPathName
parametresi tarafından belirtilen.- Sistem dizini.
GetSystemDirectory
işlevi bu dizinin yolunu almak için kullanabilirsiniz.- 16-bit sistem dizini. Bu dizinin yolunu alır işlevi yok, ama aransın.
- Windows dizin.
GetWindowsDirectory
işlevi bu dizinin yolunu almak için kullanabilirsiniz.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);
Nasıl benim Gemfile yerel bir mücevher...
Nasıl Matematik için temel belirtebili...
Nasıl Objective-C ile çalışma zamanınd...
Nasıl başlangıçta Tomcat yapılandırma ...
Nasıl özel bir github deposundan çekme...