在没有视觉工作室的情况下使用外部 dll 中的嵌入式资源
Working with embedded resources in external dll, without visual studios
好的,所以我 运行 遇到了一个问题,但我找不到解决方案。有很多使用视觉工作室属性的解决方案。问题是我没有使用视觉工作室,我正在使用 csc.exe 来编译我的代码。
这是我目前所拥有的。
exe.cmd
dll.cmd
Resource.dll
Main.csx
Rsc.csx
a.png
这是 .cmd 文件和 .csx 文件的所有代码
exe.cmd
@echo off
csc.exe /target:winexe /reference:Resource.dll /out:Main.exe Main.csx
pause
dll.cmd
@echo off
csc.exe /target:library /resource:a.png /out:Resource.dll Rsc.csx
pause
Rsc.csx
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
namespace EmIm
{
public static class Bck
{
public static Image GetBck()
{
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png"));
Image rtn = bmp;
return rtn;
}
}
}
Main.csx
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using EmIm;
namespace prg
{
class class_m
{
public static void Main()
{
Form f1 = new Form();
try
{
f1.BackgroundImage = Bck.GetBck();
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
f1.ShowDialog();
}
}
}
当我 运行 这样做时,我得到一个消息框,显示 value of 'null' is not valid for 'stream'
我需要采取哪些步骤才能通过反射访问 a.png,我已检查以确保 a.png 是程序集中的正确名称。任何帮助将不胜感激。谢谢:)
非常感谢 Hans Passant 为这个问题提供了简单的解决方案。我什至不知道去哪里寻找如何回答这个问题,但他在一条评论中总结了它。
为了使程序运行,只需更改一个文件
新建Rsc.csx文件
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
namespace EmIm
{
public static class Bck
{
[MethodImpl(MethodImplOptions.NoInlining)]
public static Image GetBck()
{
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png"));
Image rtn = bmp;
return rtn;
}
}
}
再次感谢 Hans Passant 快速解决了我的问题,希望任何其他顽固地避免使用 Visual Studios 的程序员都可以参考这个来找到一个没有它也能工作的解决方案。祝您编程愉快:)
好的,所以我 运行 遇到了一个问题,但我找不到解决方案。有很多使用视觉工作室属性的解决方案。问题是我没有使用视觉工作室,我正在使用 csc.exe 来编译我的代码。
这是我目前所拥有的。
exe.cmd
dll.cmd
Resource.dll
Main.csx
Rsc.csx
a.png
这是 .cmd 文件和 .csx 文件的所有代码
exe.cmd
@echo off
csc.exe /target:winexe /reference:Resource.dll /out:Main.exe Main.csx
pause
dll.cmd
@echo off
csc.exe /target:library /resource:a.png /out:Resource.dll Rsc.csx
pause
Rsc.csx
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
namespace EmIm
{
public static class Bck
{
public static Image GetBck()
{
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png"));
Image rtn = bmp;
return rtn;
}
}
}
Main.csx
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using EmIm;
namespace prg
{
class class_m
{
public static void Main()
{
Form f1 = new Form();
try
{
f1.BackgroundImage = Bck.GetBck();
}
catch(Exception e)
{
MessageBox.Show(e.Message);
}
f1.ShowDialog();
}
}
}
当我 运行 这样做时,我得到一个消息框,显示 value of 'null' is not valid for 'stream'
我需要采取哪些步骤才能通过反射访问 a.png,我已检查以确保 a.png 是程序集中的正确名称。任何帮助将不胜感激。谢谢:)
非常感谢 Hans Passant 为这个问题提供了简单的解决方案。我什至不知道去哪里寻找如何回答这个问题,但他在一条评论中总结了它。
为了使程序运行,只需更改一个文件
新建Rsc.csx文件
using System;
using System.IO;
using System.Drawing;
using System.Reflection;
using System.Windows.Forms;
using System.Runtime.CompilerServices;
namespace EmIm
{
public static class Bck
{
[MethodImpl(MethodImplOptions.NoInlining)]
public static Image GetBck()
{
Bitmap bmp = new Bitmap(Assembly.GetExecutingAssembly().GetManifestResourceStream("a.png"));
Image rtn = bmp;
return rtn;
}
}
}
再次感谢 Hans Passant 快速解决了我的问题,希望任何其他顽固地避免使用 Visual Studios 的程序员都可以参考这个来找到一个没有它也能工作的解决方案。祝您编程愉快:)