Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中使用动态而不引用DLL_C#_C# 4.0_Dynamic_Reflection - Fatal编程技术网

在C#中使用动态而不引用DLL

在C#中使用动态而不引用DLL,c#,c#-4.0,dynamic,reflection,C#,C# 4.0,Dynamic,Reflection,我想在C#中使用dynamic与外部API(DLL)中定义的对象进行交互。在这种情况下,我不想在我的控制台应用程序中引用API。这可行吗 例如,我使用了以下内容: dynamic obj1 = new ObjectDefinedInAPI(); 编译器一直在唠叨这个问题 The type or namespace name 'objectDefinedInAPI' could not be found ... 有什么想法吗 谢谢您可以手动加载程序集,然后在已知程序集名称和类名的情况下创建类的

我想在C#中使用dynamic与外部API(DLL)中定义的对象进行交互。在这种情况下,我不想在我的控制台应用程序中引用API。这可行吗

例如,我使用了以下内容:

dynamic obj1 = new ObjectDefinedInAPI();
编译器一直在唠叨这个问题

The type or namespace name 'objectDefinedInAPI' could not be found ...
有什么想法吗


谢谢

您可以手动加载程序集,然后在已知程序集名称和类名的情况下创建类的实例

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass");
dynamic instance = Activator.CreateInstance(aClass);

如果已知程序集名称和类名,则可以手动加载程序集,然后创建类的实例

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass");
dynamic instance = Activator.CreateInstance(aClass);

如果已知程序集名称和类名,则可以手动加载程序集,然后创建类的实例

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass");
dynamic instance = Activator.CreateInstance(aClass);

如果已知程序集名称和类名,则可以手动加载程序集,然后创建类的实例

var assembly = Assembly.LoadFrom("filepath"); 
var aClass = assembly.GetType("NameSpace.AClass");
dynamic instance = Activator.CreateInstance(aClass);

除了NeutonCode答案外,您还可以尝试以下方法:

public interface IDynamicService {
    void DoSomething();
}

public void static main() {
    var assembly = Assembly.LoadFrom("filepath"); 
    var aClass = assembly.GetType("NameSpace.AClass");
    IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService;

    if (instance != null) {
        instance.DoSomething();
    }
}

通过这种方式,您可以确保您的类型将具有特定的实现。请注意,实际的类必须继承接口才能工作,因此如果您没有访问其他dll源代码的权限,这将不会有多大帮助。这样做的好处是您可以获得Intellisense,并始终确保您的动态类与应用程序接口良好。

除了NeutronCode answer,您还可以尝试以下操作:

public interface IDynamicService {
    void DoSomething();
}

public void static main() {
    var assembly = Assembly.LoadFrom("filepath"); 
    var aClass = assembly.GetType("NameSpace.AClass");
    IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService;

    if (instance != null) {
        instance.DoSomething();
    }
}

通过这种方式,您可以确保您的类型将具有特定的实现。请注意,实际的类必须继承接口才能工作,因此如果您没有访问其他dll源代码的权限,这将不会有多大帮助。这样做的好处是您可以获得Intellisense,并始终确保您的动态类与应用程序接口良好。

除了NeutronCode answer,您还可以尝试以下操作:

public interface IDynamicService {
    void DoSomething();
}

public void static main() {
    var assembly = Assembly.LoadFrom("filepath"); 
    var aClass = assembly.GetType("NameSpace.AClass");
    IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService;

    if (instance != null) {
        instance.DoSomething();
    }
}

通过这种方式,您可以确保您的类型将具有特定的实现。请注意,实际的类必须继承接口才能工作,因此如果您没有访问其他dll源代码的权限,这将不会有多大帮助。这样做的好处是您可以获得Intellisense,并始终确保您的动态类与应用程序接口良好。

除了NeutronCode answer,您还可以尝试以下操作:

public interface IDynamicService {
    void DoSomething();
}

public void static main() {
    var assembly = Assembly.LoadFrom("filepath"); 
    var aClass = assembly.GetType("NameSpace.AClass");
    IDynamicService instance = Activator.CreateInstance(aClass) as IDynamicService;

    if (instance != null) {
        instance.DoSomething();
    }
}


通过这种方式,您可以确保您的类型将具有特定的实现。请注意,实际的类必须继承接口才能工作,因此如果您没有访问其他dll源代码的权限,这将不会有多大帮助。这样做的好处是,您可以获得Intellisense,并始终确保动态类与应用程序的接口良好。

动态加载程序集。关键字
dynamic
只是声明成员绑定被延迟,并将在运行时完成。与您进行互操作的程序集必须在某个时候加载到内存中。想想Windows API,您必须使用
DllImport
;为此,我相信您必须求助于ServiceLocator模式和包含服务接口的库。该库必须是控制台应用程序和包含从该接口继承的类的实际实现的库的公共库。然后,您可以动态加载DLL,并让它在ServiceLocator容器中自动注册。或者,如果您确实不想加载DLL,可以使用
新建ExpandooObject()
(这比创建类型实例并将其分配给
动态
字段更有意义)@jeroenvanevel
ExpandoObject
有什么帮助?Op需要使用现有的类。它可能有一些OP可能需要使用的良好实现的功能。动态加载程序集。关键字
dynamic
只是声明成员绑定被延迟,并将在运行时完成。与您进行互操作的程序集必须在某个时候加载到内存中。想想Windows API,您必须使用
DllImport
;为此,我相信您必须求助于ServiceLocator模式和包含服务接口的库。该库必须是控制台应用程序和包含从该接口继承的类的实际实现的库的公共库。然后,您可以动态加载DLL,并让它在ServiceLocator容器中自动注册。或者,如果您确实不想加载DLL,可以使用
新建ExpandooObject()
(这比创建类型实例并将其分配给
动态
字段更有意义)@jeroenvanevel
ExpandoObject
有什么帮助?Op需要使用现有的类。它可能有一些OP可能需要使用的良好实现的功能。动态加载程序集。关键字
dynamic
只是声明成员绑定被延迟,并将在运行时完成。与您进行互操作的程序集必须在某个时候加载到内存中。想想Windows API,您必须使用
DllImport
;为此,我相信您必须求助于ServiceLocator模式和包含服务接口的库。该库必须是控制台应用程序和包含从该接口继承的类的实际实现的库的公共库。然后,您可以动态加载DLL,并让它在ServiceLocator容器中自动注册。或者,如果您确实不想加载DLL,可以使用
new ExpandoObject()
(这比创建类型实例并将其分配给
dynamic
字段更有意义)。@jeroenvanevel How
Expa