我想在运行时加载和创建程序集,有人告诉我使用命名空间System.Reflection.Assembly和System.Reflection.Emit.
我在msdn上找到的只有参考资料,但是当你不知道在哪里以及如何开始时它不适合使用它.我已经谷歌搜索,但我没有找到任何有用的教程/样本/参考.
有人可以向我解释功能或给我一些示例/教程吗?
我正在尝试将一些.exe和.dll文件嵌入到我的应用程序中(只需将所需文件包含到我的项目中,右键单击它们并将Build Action更改为"Embedded Resource").这是我提取的代码:
private void ExtractTo(string path){
string filename = "MyNamespace.Resources.MyEmbeddedEXEfile.exe";
Assembly asm = Assembly.GetExecutingAssembly();
string[] resourceNames = asm.GetManifestResourceNames();
if(resourceNames.Contains(filename)){
Stream s = asm.GetManifestResourceStream(filename);
byte[] buffer = new byte[s.Length];
File.WriteAllBytes(path + "\\MyEXEfile.exe", buffer);
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎运行良好,嵌入式文件被提取到传入的路径,它与我在项目中包含的文件大小相同,并作为资源嵌入.但是在点击提取的EXE文件后,它似乎已损坏,显示一个错误对话框,说明" 此文件的版本与您正在运行的Windows版本不兼容.检查计算机的系统信息,看看是否需要程序的x86(32位)或x64(64位),然后联系您的软件发行商. "好吧,我正是该软件的发布者=)).
我使用的是Windows 7 Ultimate 64位.原始文件(我选择嵌入)是一个32位文件.我也试过一个dll文件,提取的dll文件也不能像原来的那样工作.
你能指出我的代码中提取资源有什么问题,或者我把它作为资源嵌入后文件被破坏了吗???
非常感谢您的帮助.谢谢.
我正在学习C#。我阅读了 Andrew Troelsen 的《C# and the .NET Platform》和 Jeffrey Richter 的《CLR via C#》等书。现在,我正在尝试创建应用程序,它将从某个目录加载程序集,将它们推送到 AppDomain 并运行包含的方法(支持插件的应用程序)。这是 DLL,其中是公共接口。我将其添加到我的应用程序以及所有带插件的 DLL 中。主库.DLL
namespace MainLib
{
public interface ICommonInterface
{
void ShowDllName();
}
}
Run Code Online (Sandbox Code Playgroud)
这是插件:PluginWithOutException
namespace PluginWithOutException
{
public class WithOutException : MarshalByRefObject, ICommonInterface
{
public void ShowDllName()
{
MessageBox.Show("PluginWithOutException");
}
public WithOutException()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
另一个:PluginWithException
namespace PluginWithException
{
public class WithException : MarshalByRefObject, ICommonInterface
{
public void ShowDllName()
{
MessageBox.Show("WithException");
throw new NotImplementedException();
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个应用程序,它加载 DLL 并在另一个 AppDomain 中运行它们
namespace …
Run Code Online (Sandbox Code Playgroud) 如标题所述.我尝试使用Bindingflags但它们似乎都没有工作:
Assembly assembly = Assembly.LoadFile(somePath);
foreach (var type in assembly.GetTypes())
{
foreach(var method in type.GetMethods())
Console.WriteLine(method.Name);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试获得此功能:
Class<?> c = Class.forName(dir.substring(6).replaceAll("/", ".")
+ file.getName().replaceAll(".java", ""));
Packet packet = (Packet)c.newInstance();
Run Code Online (Sandbox Code Playgroud)
对于熟悉它的任何人,上面的代码都是Java,它从目录中获取类,然后创建它的实例,这就是我在C#中试图做的事情
我已经走了这么远,现在我被困住了...
foreach(Type t in assembly.GetTypes())
{
if (t.BaseType == typeof(Packet))
{
Run Code Online (Sandbox Code Playgroud)
基本上,我需要找到一种从Type构造类的方法,然后创建它的实例。
我试过使用激活器,如下所示:
foreach(Type t in assembly.GetTypes())
{
if (t.BaseType == typeof(Packet))
{
string namespaceName = t.Namespace;
string className = t.Name;
var myObj = Activator.CreateInstance(namespaceName, className);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何引用它作为一个类而不是ObjectHandle
我尝试在C#中使用简单的预处理程序指令进行调试和发布模式.
例如:
using System;
public class C {
public void M() {
#if DEBUG
Console.WriteLine("Debug");
#else
Console.WriteLine("Release");
#endif
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码非常简单明了.
但是当我看到IL代码时,我没有关于debug指令的任何内容.
.class private auto ansi '<Module>'
{
} // end of class <Module>
.class public auto ansi beforefieldinit C
extends [mscorlib]System.Object
{
// Methods
.method public hidebysig
instance void M () cil managed
{
// Method begins at RVA 0x2050
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Release"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: …
Run Code Online (Sandbox Code Playgroud) 我在创建静态void Main()的程序集实例时遇到问题.
Heres是程序集的代码(.NET Exe)
namespace Test
{
internal static class Program
{
[STAThread]
private static void Main(string[] args)
Run Code Online (Sandbox Code Playgroud)
这是启动器代码:bin是一个包含从文件读取的程序集的字节数组.
Assembly asm = Assembly.Load(bin);
MethodInfo method = asm.EntryPoint;
object obj = asm.CreateInstance(method.ToString());
method.Invoke(obj, null);
Run Code Online (Sandbox Code Playgroud)
由于参数不匹配,obj始终为null并且Invoke抛出异常.