C#DLL导出到Inno安装程序-错误E0434F4D

C#DLL导出到Inno安装程序-错误E0434F4D,c#,inno-setup,dllexport,C#,Inno Setup,Dllexport,我有一个C#DLL,我从中通过RGiesecke.DllExport导出一个方法 当我从C#控制台应用程序调用导出的方法时,一切正常 但是我在Inno设置中使用它,并且在那里我得到以下错误: 导出的方法使用另一个DLL中的另一个方法。 奇怪的是,为什么我可以从另一个类调用方法,但不能从另一个DLL调用。 在下面的示例中,我标记了不起作用的方法 我的问题是,为什么我会出现这个错误 第一个DLL namespace ExposeTestLibrary { public class Test

我有一个C#DLL,我从中通过RGiesecke.DllExport导出一个方法

当我从C#控制台应用程序调用导出的方法时,一切正常 但是我在Inno设置中使用它,并且在那里我得到以下错误:

导出的方法使用另一个DLL中的另一个方法。 奇怪的是,为什么我可以从另一个类调用方法,但不能从另一个DLL调用。 在下面的示例中,我标记了不起作用的方法

我的问题是,为什么我会出现这个错误

第一个DLL

namespace ExposeTestLibrary
{
    public class TestClass
    {
        [DllExport("Test2", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static void Test2()
        {
            //works
            TestClass tc = new TestClass();
            tc.DoSomething2();

            //works
            SubLib2 sl2 = new SubLib2();
            sl2.DoSomething3();

            //Doesn't work
            SubLib sl = new SubLib();
            sl.DoSomething();
        }

        public void DoSomething2() 
        {
            System.Windows.Forms.MessageBox.Show("DoSomething2");
        }
    }

    public class SubLib2
    {
        public SubLib2()
        {

        }

        public void DoSomething3()
        {
            System.Windows.Forms.MessageBox.Show("DoSomething3");
        }
    }
}
namespace ExposeSubLibrary
{
    public class SubLib
    {
        public SubLib() 
        {

        }

        public void DoSomething() 
        {
            System.Windows.Forms.MessageBox.Show("DoSomething");
        }
    }
}
第二个DLL

namespace ExposeTestLibrary
{
    public class TestClass
    {
        [DllExport("Test2", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
        public static void Test2()
        {
            //works
            TestClass tc = new TestClass();
            tc.DoSomething2();

            //works
            SubLib2 sl2 = new SubLib2();
            sl2.DoSomething3();

            //Doesn't work
            SubLib sl = new SubLib();
            sl.DoSomething();
        }

        public void DoSomething2() 
        {
            System.Windows.Forms.MessageBox.Show("DoSomething2");
        }
    }

    public class SubLib2
    {
        public SubLib2()
        {

        }

        public void DoSomething3()
        {
            System.Windows.Forms.MessageBox.Show("DoSomething3");
        }
    }
}
namespace ExposeSubLibrary
{
    public class SubLib
    {
        public SubLib() 
        {

        }

        public void DoSomething() 
        {
            System.Windows.Forms.MessageBox.Show("DoSomething");
        }
    }
}
以下是我在Inno Setup中对它的称呼

[Code]
    procedure Test2();
    external 'Test2@{src}\ExposeTestLibrary.dll stdcall loadwithalteredsearchpath';

function InitializeSetup:boolean;
begin
    MsgBox('WAIT', mbInformation, MB_OK); 
    Test2();
    result:=true;
end;

Hans是对的,您必须考虑如何报告或记录错误

但是,在您的情况下,我想问题是CLR找不到另一个程序集。 程序集不是相对于使用它们的程序集进行解析的,而是相对于当前appdomain的探测路径进行解析的。 在您的情况下,appdomain将是默认的,您的探测路径将是可执行文件的目录


您可以在TestClass的静态ctor中设置AssemblyResolve的处理程序。或者只加载assembly.load一次,并加载其完整文件名(也在静态ctor中)

当遇到互操作问题时,程序员会想“我知道,我会使用[DllExport]”。现在他们有两个问题。导出的方法无法引发任何异常。使用try/catch-em-all并以某种方式记录异常,以便在返回false时调用方能够检索它,这是一项非常严格的要求。我不太确定您的评论应该说明什么。1.我的方法不能抛出任何异常?这是真的,从任何进一步的测试中,这是我自己发现的。2.当某些东西失败时返回false?因为这显然是一个测试,为了便于理解,我把它缩小了,我认为这与问题无关