PDA

View Full Version : قرار دادن فونت در dll



sadeghjun
چهارشنبه 20 شهریور 1392, 19:01 عصر
سلام
من یه کامپوننت درست کردم و در اون از یه فونت است استفاده کردم.
1- چطور میتونم این فونت رو داخل فایل dll قرار بدم. من فونت رو ریختم تو resources ولی خطا داد. مشکل چیه. چه حوری میشه اینکارو کرد؟
2- چه جوری میشه یه فایل dll رو داخل dll گذاشت. (تو کامپوننت من از یه کامپوننت دیگه استفاده شده)

shahryari
چهارشنبه 20 شهریور 1392, 20:14 عصر
باسلام
البته شما در تالار سی شارپ این سوال را مطرح کردید و در این سیستم من فقط وی بی دات نت نصب است و دسترسی به IDE سی را ندارم ، لذا کدها را در زبان وی بی دات نت تست کردم و جواب داد و برایتان به زبان وی بی دات نت گذاشتم که از این بابت عذرخواهی میکنم

1- چطور میتونم این فونت رو داخل فایل dll قرار بدم. من فونت رو ریختم تو resources ولی خطا داد. مشکل چیه. چه حوری میشه اینکارو کرد؟شدنش که میشه 100 %
ابتدا یک فونت را که در سیستمتان نصب نیست را کپی و در قسمت ریسورسیز پروژه پیست کنید
Imports System.Drawing.Text
Imports System.Runtime.InteropServices
Private myFonts As PrivateFontCollection
Private fontBuffer As IntPtr

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If myFonts Is Nothing Then
myFonts = New PrivateFontCollection
Dim font() As Byte = My.Resources.IranNastaliq
fontBuffer = Marshal.AllocCoTaskMem(font.Length)
Marshal.Copy(font, 0, fontBuffer, font.Length)
myFonts.AddMemoryFont(fontBuffer, font.Length)
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Label1.Font = New Font(myFonts.Families(0), 16, FontStyle.Regular)
End Sub



2- چه جوری میشه یه فایل dll رو داخل dll گذاشت. (تو کامپوننت من از یه کامپوننت دیگه استفاده شده)باید توجه داشته باشید که بعضی دی ال ال ها که رابط گرافیکی و آبجکت و فرم دارند را نمیتوان به ریسورس انبدد کرد (عنایت داشته باشید که عرض کردم بعضی دی ال ال ها)
اما من اکثر دی ال هایی که فقط از توابعشون استفاده میکنم و رابط گرافیکی ندارند ، را به فایل اگزه مرج میکنم و استفاده میکنم
ابتدا تابع زیر را تعریف کنید
Private Function ResolveAssemblies(ByVal sender As Object, ByVal e As System.ResolveEventArgs) As Reflection.Assembly
Dim desiredAssembly = New Reflection.AssemblyName(e.Name)

If desiredAssembly.Name = "test_dll" Then
Return Reflection.Assembly.Load(My.Resources.test_dll)
Else
Return Nothing
End If
End Function
سپس در رویداد لود برنامه فراخوانی بکنبد
AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf ResolveAssemblies

موفق باشید

sadeghjun
چهارشنبه 20 شهریور 1392, 20:57 عصر
سلام ممنون
کد مربوطه رو تبدیل کردم و کار کرد ولی کد مربوط به dll v رو چه چوری استفاده کنم؟
کد فونت:
if (myFonts == null)
{
myFonts = new PrivateFontCollection();
byte[] font = Properties.Resources.B_Nazanin;
fontBuffer = Marshal.AllocCoTaskMem(font.Length);
Marshal.Copy(font, 0, fontBuffer, font.Length);
myFonts.AddMemoryFont(fontBuffer, font.Length);
}

Label1.Font = new Font(myFonts.Families[0], 13, FontStyle.Regular);


اینم کد dll:
private System.Reflection.Assembly ResolveAssemblies(object sender, System.ResolveEventArgs e)
{
dynamic desiredAssembly = new System.Reflection.AssemblyName(e.Name);

if (desiredAssembly.Name == "test_dll")
{
return System.Reflection.Assembly.Load(Properties.Resourc es.Ionic_Zip);
}
else {return null; }

}

اینم در لود فرم:
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssemblies;

shahryari
چهارشنبه 20 شهریور 1392, 21:08 عصر
خیلی خوب تبدیل کردی احسنت اما ....
test_dll را با Ionic.Zip عوض کن

private System.Reflection.Assembly ResolveAssemblies(object sender, System.ResolveEventArgs e)
{
dynamic desiredAssembly = new System.Reflection.AssemblyName(e.Name);

if (desiredAssembly.Name == "Ionic.Zip")
{
return System.Reflection.Assembly.Load(Properties.Resourc es.Ionic_Zip);
}
else {return null; }

}

sadeghjun
چهارشنبه 20 شهریور 1392, 21:46 عصر
ممنون
خوب چه جوری تو برنامه ازش استفاده کنم؟
من یه تابع دارم که فایل زیپ رو Extract میکنه:

using (var zip = Ionic.Zip.ZipFile.Read("file address"))
{
zip.Password = "123";
zip.ExtractAll("destination address");
}

sadeghjun
چهارشنبه 20 شهریور 1392, 22:36 عصر
تو برنامه به کد بالا گیر مده

sadeghjun
پنج شنبه 21 شهریور 1392, 09:12 صبح
سلام
کسی میتونه کمک کنه؟