标签: .net-assembly

有人可以向我解释汇编类的功能吗?

我想在运行时加载和创建程序集,有人告诉我使用命名空间System.Reflection.Assembly和System.Reflection.Emit.

我在msdn上找到的只有参考资料,但是当你不知道在哪里以及如何开始时它不适合使用它.我已经谷歌搜索,但我没有找到任何有用的教程/样本/参考.

有人可以向我解释功能或给我一些示例/教程吗?

.net c# runtime dynamic .net-assembly

0
推荐指数
1
解决办法
142
查看次数

使用Reflection从资源中提取的.exe和.dll文件无效?

我正在尝试将一些.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# reflection embedded-resource .net-assembly

0
推荐指数
1
解决办法
1765
查看次数

当另一个域抛出异常时应用程序崩溃

我正在学习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)

c# exception appdomain .net-assembly

0
推荐指数
1
解决办法
2592
查看次数

C#Reflection Assembly:getMethods()忽略构造函数

如标题所述.我尝试使用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)

c# reflection constructor .net-assembly

0
推荐指数
1
解决办法
190
查看次数

C#根据类型创建类的实例

我正在尝试获得此功能:

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# java reflection .net-assembly

0
推荐指数
1
解决办法
588
查看次数

IL代码中的C#预处理器指令

我尝试在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)

.net c# .net-assembly .net-core

0
推荐指数
1
解决办法
262
查看次数

创建实例并调用程序集的静态Main

我在创建静态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抛出异常.

c# createinstance invoke .net-assembly

-7
推荐指数
1
解决办法
406
查看次数